Итак, я хочу создать простую службу заказа еды, но для этой службы требуется некоторая информация от другой службы, поэтому я использую шаблон саги. Вот как это должно работать, если я закажу еду. Сначала он попытается создать заказ, но если возникнет какая-либо ошибка, он повторит попытку 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). Это продолжается бесконечно, это потому, что мой код или какая-то конфигурация или может быть что-то еще?
EventScheduler
вы настроили прямо сейчас? И, наконец, есть ли у вас случайный образец проекта, в котором я / кто-то еще может последовательно воспроизвести проблему? - person Steven   schedule 12.11.2020