为什么在NoHandlerForCommandException之后Axon Framework中的RetryScheduler不重试?

时间:2019-06-13 18:49:09

标签: java microservices cqrs event-sourcing axon

所以我有一个Saga,Saga在特定事件上向不同的微服务发送命令。我想使用RetryScheduler配置commandGateway,以便在其他微服务关闭时重试发送命令。 RetryScheduler仅在异常是RuntimeException时才执行重试,而在其他服务(如果确实是离线)时抛出RuntimeException时将抛出NoHandlerForCommandException。

如果我未设置maxRetryCount,则错误消息为
o.a.c.gateway.IntervalRetryScheduler:处理命令[XXXCommand]导致异常1次。永久放弃

如果我确实设置了属性,则错误消息为
o.a.c.gateway.IntervalRetryScheduler:处理命令[XXXCommand]会导致异常,并且不会重试

如果另一个微服务正在运行,则该命令已正确处理,没有问题。

有人知道可能是什么问题吗?

这是我对带有RetryScheduler的commandGateway的配置:

@Bean
public CommandGateway commandGateway(){

    Configurer configurer = DefaultConfigurer.defaultConfiguration();

    CommandBus commandBus = configurer.buildConfiguration().commandBus();

    ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
    RetryScheduler rs = IntervalRetryScheduler.builder().retryExecutor(scheduledExecutorService).maxRetryCount(100).retryInterval(1000).build();
    CommandGateway commandGateway = DefaultCommandGateway.builder().commandBus(commandBus).retryScheduler(rs).build();

    return commandGateway;
}

1 个答案:

答案 0 :(得分:1)

要解决当前的问题,您可以提供自己的variable.substring(1, variable.length-1) 实现,该实现将覆盖res0: String = 123 方法,以考虑重试IntervalRetryScheduler的情况。

请注意,尽管IntervalRetryScheduler#isExplicitlyNonTransient(Throwable)有意仅重试类型为NoHandlerForCommandException的异常,但这些异常通常表示可恢复的异常。 IntervalRetryScheduler意味着正在使用的AxonNonTransientException实现也不知道该向谁发出命令,这通常暗示了无法重试的事情。

然而,看来您有一个确实可行的方案。因此,就像我在开始时指出的那样,重写NoHandlerForCommandException方法以排除CommandBus是我认为适合您的方法。

希望这对您有所帮助!