实施 EventProcessingConfigurer、registerErrorHandler 以正确处理@EventHandler 错误

Implementing EventProcessingConfigurer,registerErrorHandler to properly handle @EventHandler errors

我正在尝试通过 EventProcessingConfigurer.registerErrorHandler() 方法添加一个 ErrorHandler,当它显示在配置上时,class 本身没有被调用。

我目前正在使用 Axon 4.1.1(没有 Axon 服务器)和 Spring Boot 2.1。6.RELEASE。

我的代码基于 github/AxonFramework 但它的行为并不相同。

配置:

@Autowired
public void configure(final EventProcessingConfigurer config) {
    TestErrorHandler testErrorHandler = new TestErrorHandler();
    config.registerErrorHandler("SolrProjection", configuration -> testErrorHandler);
}

错误处理器:

public class TestErrorHandler implements ErrorHandler, ListenerInvocationErrorHandler {
    @Override
    public void handleError(final ErrorContext errorContext) throws Exception {
        System.out.println("TestErrorHandler.handleError()");
    }

    @Override
    public void onError(final Exception exception, final EventMessage<?> event, final EventMessageHandler eventHandler) {
        System.out.println("TestErrorHandler.onError()");
    }
}

投影:

@Configuration
@RequiredArgsConstructor
@ProcessingGroup("SolrProjection")
public class SolrProjection {
    @EventHandler
    public void onEvent(final TestEvent event,
                        @SequenceNumber Long sequenceNumber,
                        @Timestamp final Instant requestTimestamp,
                        @MessageIdentifier final String messageIdentifier,
                        final MetaData metaData) {
        if (true) {
            throw new IllegalStateException();
        }
    }

即使你直接抛出错误,我也从未在控制台中看到两个 system.out。并在 @EventHandler 中放置日志语句被正确调用。

ErrorHandler 的任务是处理与您预期不同的异常。 在处理事件时,Axon Framework 推导出两层:

  1. 内部EventProcessor
  2. 框架用户编写的事件处理组件

EventProcessor 中抛出的异常由您配置的 ErrorHandler 处理。 要自定义处理来自您自己的事件处理程序的异常的过程,您 将必须配置 ListenerInvocationErrorHandler.

要配置 general/default ListenerInvocationErrorHandler,您可以在第一个代码段中使用以下方法:

EventProcessingConfigurer#registerDefaultListenerInvocationErrorHandler(
        Function<Configuration, ListenerInvocationErrorHandler>
)

您还可以在 this 页面查看 Axon 的参考指南,了解更多信息。 希望这可以帮助你@sherring!