I have a collection migrationTest in MongoDB with a unique index for the message field.
In my migration I'm inserting documents to this collection and in one place I'm using the existing message to simulate error.
The Exception is thrown on migration as expected, but rollback() method is not executed and first two documents are persisted.
What I'm doing wrong here?
This is a SpringBoot application with reactive MongoDB and for mongock I'm using
- io.mongock:mongock-springboot:5.5.1
- io.mongock:mongodb-reactive-driver:5.5.1
The FirstMigration class:
import com.mongodb.client.result.DeleteResult
import io.mongock.api.annotations.ChangeUnit
import io.mongock.api.annotations.Execution
import io.mongock.api.annotations.RollbackExecution
import io.mongock.driver.mongodb.reactive.util.MongoSubscriberSync
import org.bson.Document
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.data.mongodb.core.ReactiveMongoTemplate
import org.springframework.data.mongodb.core.query.Criteria
import org.springframework.data.mongodb.core.query.Query
import reactor.core.publisher.Flux
import java.time.Instant
@ChangeUnit(id = "migration-test", order = "202410291559")
class FirstMigration(private val mongoTemplate: ReactiveMongoTemplate) {
val logger: Logger = LoggerFactory.getLogger(javaClass)
val collectionName = "migrationTest"
val message = "Test"
@Execution
fun execute() {
logger.info("Creating test documents...")
val subscriber = MongoSubscriberSync<Document>()
Flux.fromIterable(listOf(1, 2, 1, 3, 4))
.concatMap { i ->
val doc = Document(mapOf("message" to "$message $i", "timestamp" to Instant.now()))
mongoTemplate.insert(doc, collectionName)
}.subscribe(subscriber)
subscriber.await()
}
@RollbackExecution
fun rollback() {
logger.info("Removing test documents...")
val subscriber = MongoSubscriberSync<DeleteResult>()
val query = Query(Criteria.where("message").regex("^${message}"))
mongoTemplate.remove(query, collectionName).subscribe(subscriber)
val result = subscriber.getFirst()
logger.info("Documents removed [ count: {}, wasAcknowledged: {} ]", result.deletedCount, result.wasAcknowledged())
}
}