【发布时间】:2020-10-26 10:44:13
【问题描述】:
所以我想创建一个简单的订餐服务,但该服务需要来自其他服务的一些信息,所以我使用 saga 模式。如果我订购食物,它应该如何工作,首先它会尝试创建订单,但如果有任何错误,它将重试 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 中的事件日志)。这一直在无限循环,这是因为我的代码或某些配置还是其他原因?
【问题讨论】:
-
这是你遇到的一个有趣的问题@Patrick。首先,你能提供你正在使用的框架和服务器版本吗?此外,您现在配置了
EventScheduler的哪个实例?最后,您是否有机会拥有一个示例项目,让我/其他人可以持续重演该问题? -
没关系,我已经修好了。由某人刚刚入侵了我的数据库并开始删除所有数据导致的问题,因此跟踪令牌已被重置并且所有事件再次开始重新运行。
-
哇,好吧,老实说,有人简单地入侵了您的设置,这听起来并不令人愉快。很高兴你找到了罪魁祸首。可能值得将其标记为该问题的解决方案,以便其他阅读本文的人也能理解出了什么问题。
-
很高兴看到您已经解决了所有问题@Patrick ...您介意将自己的解决方案添加到 stackoverflow 吗?在这种情况下,我们不必再考虑寻找解决方案了。
-
当然,我已经添加了解决方案。希望对您有所帮助。