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内部的事件日志)。这样会无限循环,这是因为我的代码或某些配置还是其他原因?

解决方法

所以问题是我忘记为我的 MongoDB 设置我的用户名和密码,然后有人试图删除我的所有数据,包括 axon-server 的跟踪令牌。因此,由于跟踪令牌已被删除,axon-server 开始创建具有 0 值的新令牌,这使得所有事件开始一次又一次地重新运行。我通过为我的 MongoDB 添加用户名和密码来解决这个问题。