Kotlin Axonframework事件调度器不断无限次地重新运行我的事件
所以我想创建一个简单的食品订购服务,但是这个服务需要来自其他服务的一些信息,所以我使用了saga模式。如果我点了一份食物,它应该是这样工作的,首先它会尝试创建订单,但如果出现任何错误,它会重试3次并发布成功或失败事件。Kotlin Axonframework事件调度器不断无限次地重新运行我的事件,kotlin,axon,saga,Kotlin,Axon,Saga,所以我想创建一个简单的食品订购服务,但是这个服务需要来自其他服务的一些信息,所以我使用了saga模式。如果我点了一份食物,它应该是这样工作的,首先它会尝试创建订单,但如果出现任何错误,它会重试3次并发布成功或失败事件。 下面是示例代码 @Saga class OrderCreationSaga { @Transient @Autowired private lateinit var commandGateway: CommandGateway @Transient @Au
下面是示例代码
@Saga
class OrderCreationSaga {
@Transient
@Autowired
private lateinit var commandGateway: CommandGateway
@Transient
@Autowired
private lateinit var eventScheduler: EventScheduler
@Transient
@Autowired
private lateinit var eventBus: EventBus
@Transient
@Autowired
private lateinit var scheduleToken: ScheduleToken
private lateinit var orderId: String
private var retryCounter = 1
@StartSaga
@SagaEventHandler(associationProperty = "orderId")
fun on(event: OrderCreationAttempted) {
this.orderId = event.orderId
eventBus.publish(GenericEventMessage(event.toOrderCreationRequested()))
}
@SagaEventHandler(associationProperty = "orderId")
fun on(event: OrderCreationRequested) {
try {
// send data to another service
orderCreationService.createOrder(event).block()
eventBus.publish(GenericEventMessage(
OrderCreationSuccess(
orderId = event.orderId
))
)
} catch (error: Throwable) {
// catching request error, retry for 3 times
if (this.retryCounter == 3) {
eventBus.publish(GenericEventMessage(
OrderCreationFailed(
orderId = this.orderId,
)
))
} else {
eventBus.publish(GenericEventMessage(
OrderCreationRetry(
orderId = event.orderId,
)
))
this.retryCounter++
}
}
}
@EndSaga
@SagaEventHandler(associationProperty = "orderId")
fun on(event: OrderCreationSuccess) {
// do the success job
}
@EndSaga
@SagaEventHandler(associationProperty = "orderId")
fun on(event: OrderCreationFailed) {
// do the failed job
}
@SagaEventHandler(associationProperty = "orderId")
fun on(event: OrderCreationRetry) {
val duration = Duration.ofSeconds(30)
val scheduleEvent = OrderCreationRequested(orderId = event.orderId)
scheduleToken = eventScheduler.schedule(duration, scheduleEvent)
}
}
但是奇怪的事情发生了,所以在它发布了一个成功事件之后,出于某种原因,它将再次发布OrderCreationRequested事件(我知道这一点,因为我已经检查了axonserver内部的事件日志)。这会无限循环,这是因为我的代码或某些配置还是其他原因?所以问题是我忘记为我的MongoDB设置用户名和密码,然后有人试图删除我的所有数据,包括axon服务器的跟踪令牌。因此,由于跟踪令牌已被删除,因此axon服务器开始创建具有0值的新令牌,这使得所有事件开始一次又一次地重新运行。我只需为我的MongoDB添加用户名和密码就可以解决这个问题。这是一个有趣的问题@Patrick。首先,你能提供你正在使用的框架和服务器版本吗?此外,您现在配置了
EventScheduler
的哪个实例?最后,你是否有一个示例项目,我/其他人可以一直重复这个问题?不管怎样,我已经修复了它。有人刚刚入侵了我的数据库并开始删除所有数据,因此跟踪令牌已重置,所有事件再次开始重新运行。哇,好吧,有人入侵了你的设置听起来并不令人愉快。很高兴你找到了罪犯。也许值得将此标记为这个问题的解决方案,以便其他阅读此内容的人也能理解错误所在。很高兴看到您@Patrick已经修复了所有问题。。。您介意为stackoverflow添加您自己的解决方案吗?在这种情况下,我们不必再寻找解决方案了。当然,我已经添加了解决方案。希望对你有帮助。