所以我有一个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;
}
答案 0 :(得分:1)
要解决当前的问题,您可以提供自己的variable.substring(1, variable.length-1)
实现,该实现将覆盖res0: String = 123
方法,以考虑重试IntervalRetryScheduler
的情况。
请注意,尽管IntervalRetryScheduler#isExplicitlyNonTransient(Throwable)
有意仅重试类型为NoHandlerForCommandException
的异常,但这些异常通常表示可恢复的异常。 IntervalRetryScheduler
意味着正在使用的AxonNonTransientException
实现也不知道该向谁发出命令,这通常暗示了无法重试的事情。
然而,看来您有一个确实可行的方案。因此,就像我在开始时指出的那样,重写NoHandlerForCommandException
方法以排除CommandBus
是我认为适合您的方法。
希望这对您有所帮助!