如何获取在 Axon 错误处理程序中产生错误的事件处理程序?

How can I get the event handler that produced an error in a Axon Error handler?

我刚刚为 ListenerInvocationErrorHandler 中处理的错误实现了死信:

override fun onError(exception: Exception, event: EventMessage<*>, eventHandler: EventMessageHandler) {
        // Insert in dead letter
    }

这工作正常,因为我已经获得了我需要的信息(异常、事件和事件处理程序),所以我可以通过调用 eventHandler.process(event).

来重新处理

但是,对于在 ErrorHandler 中处理的错误(通常是持久性错误),我缺少事件处理程序信息:

override fun handleError(errorContext: ErrorContext) {
        // No event handler info
    }

考虑到每个事件处理程序都隔离在不同的处理组中,因此每个事件处理程序都应该 运行 在其自己的事务中... 有什么方法可以获取产生错误的事件处理程序吗?

ErrorHandler 级别,您“缺少”事件处理程序信息,因为从 Axon Framework 中调用 ErrorHandler 并不一定意味着实际的 @EventHandler 注释函数具有已被调用。

因此,无法保证此事,因此此时没有提供事件处理程序。

此外,如果达到 ErrorHandler,通常意味着事务(UnitOfWork)将被回滚。因此,对于任何事件处理程序或事件处理组件,操作将被调整。

因此,进入 ErrorHandler 的异常本质上意味着应该再次调用事件处理器的 all 事件处理程序部分。因此,知道确切的实例并不是迫切需要的。 相反,您需要一个 [定期/在调用时] 检查死信队列并调用给定事件处理器的所有处理程序以再次处理给定事件的进程。

这是我对场景的两分钱,希望这对你有所帮助。