Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Axonframework事件调度器不断无限次地重新运行我的事件_Kotlin_Axon_Saga - Fatal编程技术网

Kotlin Axonframework事件调度器不断无限次地重新运行我的事件

Kotlin Axonframework事件调度器不断无限次地重新运行我的事件,kotlin,axon,saga,Kotlin,Axon,Saga,所以我想创建一个简单的食品订购服务,但是这个服务需要来自其他服务的一些信息,所以我使用了saga模式。如果我点了一份食物,它应该是这样工作的,首先它会尝试创建订单,但如果出现任何错误,它会重试3次并发布成功或失败事件。 下面是示例代码 @Saga class OrderCreationSaga { @Transient @Autowired private lateinit var commandGateway: CommandGateway @Transient @Au

所以我想创建一个简单的食品订购服务,但是这个服务需要来自其他服务的一些信息,所以我使用了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内部的事件日志)。这会无限循环,这是因为我的代码或某些配置还是其他原因?

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

这是一个有趣的问题@Patrick。首先,你能提供你正在使用的框架和服务器版本吗?此外,您现在配置了
EventScheduler
的哪个实例?最后,你是否有一个示例项目,我/其他人可以一直重复这个问题?不管怎样,我已经修复了它。有人刚刚入侵了我的数据库并开始删除所有数据,因此跟踪令牌已重置,所有事件再次开始重新运行。哇,好吧,有人入侵了你的设置听起来并不令人愉快。很高兴你找到了罪犯。也许值得将此标记为这个问题的解决方案,以便其他阅读此内容的人也能理解错误所在。很高兴看到您@Patrick已经修复了所有问题。。。您介意为stackoverflow添加您自己的解决方案吗?在这种情况下,我们不必再寻找解决方案了。当然,我已经添加了解决方案。希望对你有帮助。