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

问题描述

我刚刚为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 事件处理程序部分应再次调用。因此,知道确切的实例并不是紧迫的必要。 取而代之的是,您需要一个过程,该过程[定期/在调用时]检查死信队列,并调用给定事件处理器的所有处理程序以再次处理给定事件。

那是我的二分钱,希望这对你有帮助。