问题描述
因此,我想创建一个简单的食品订购服务,但是该服务需要其他服务中的一些信息,因此我使用了传奇模式。如果我点了菜,这是应该如何工作的,首先它会尝试创建订单,但是如果有任何错误,它将重试3次并发布成功或失败事件。
这是示例代码。
@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-server 的跟踪令牌。因此,由于跟踪令牌已被删除,axon-server 开始创建具有 0 值的新令牌,这使得所有事件开始一次又一次地重新运行。我通过为我的 MongoDB 添加用户名和密码来解决这个问题。