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