Планировщик событий Axonframework продолжает бесконечно повторять мое мероприятие

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


person Patrick    schedule 26.10.2020    source источник
comment
У вас там интересная проблема, @Patrick. Во-первых, можете ли вы предоставить используемую платформу и версию сервера? Кроме того, какой экземпляр EventScheduler вы настроили прямо сейчас? И, наконец, есть ли у вас случайный образец проекта, в котором я / кто-то еще может последовательно воспроизвести проблему?   -  person Steven    schedule 12.11.2020
comment
Неважно, что я это уже починил. Проблема, вызванная тем, что кто-то только что взломал мою базу данных и начал удалять все данные, поэтому токен отслеживания был сброшен, и все события снова запускаются.   -  person Patrick    schedule 16.11.2020
comment
Вау, ладно, честно говоря, звучит не очень приятно, что кто-то просто взломал вашу систему. Счастлив, что ты нашел виноватого. Возможно, стоит отметить это как решение этого вопроса, чтобы другие, читающие это, тоже поняли, что пошло не так.   -  person Steven    schedule 17.11.2020
comment
Приятно видеть, что все уже исправлено вами, @Patrick ... не могли бы вы добавить свое собственное решение в stackoverflow? В этом случае нам больше не нужно искать решение.   -  person Lucas Campos    schedule 17.12.2020
comment
Конечно, я уже добавил раствор. надеюсь, что это будет полезно.   -  person Patrick    schedule 23.12.2020


Ответы (1)


Итак, проблема заключалась в том, что я забыл установить свое имя пользователя и пароль для моей MongoDB, а затем кто-то просто пытался удалить все мои данные, включая токен отслеживания для аксон-сервера. Таким образом, из-за того, что токен отслеживания был удален, аксон-сервер начинает создавать новый со значением 0, что заставляет все события запускаться снова и снова. Я решаю эту проблему, просто добавляя имя пользователя и пароль для моей MongoDB.

person Patrick    schedule 23.12.2020