【问题标题】:Axonframework event scheduler keeps rerunning my event infinitelyAxonframework 事件调度程序不断地重新运行我的事件
【发布时间】: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 吗?在这种情况下,我们不必再考虑寻找解决方案了。
  • 当然,我已经添加了解决方案。希望对您有所帮助。

标签: kotlin axon saga


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 2019-01-20
    • 2010-10-06
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2011-10-13
    相关资源
    最近更新 更多