Почему RetryScheduler в Axon Framework не повторяется после исключения NoHandlerForCommandException? - PullRequest
1 голос
/ 13 июня 2019

поэтому у меня есть Saga, и Saga отправляет команду другому микросервису на конкретное событие.Я хотел настроить commandGateway с RetryScheduler, чтобы он попытался отправить команду в случае, если другой микросервис не работает.RetryScheduler будет выполнять повторные попытки только в том случае, если исключение представляет собой RuntimeException, которое NoHandlerForCommandException выдает, когда другая служба, если автономно определенно, является.

Если я не установил maxRetryCount, то сообщение об ошибке будет
oacgateway.IntervalRetryScheduler: Обработка команды [XXXCommand] привела к исключению 1 раз.Отмена навсегда

Если я установлю атрибут, сообщение об ошибке будет
oacgateway.IntervalRetryScheduler: Обработка команды [XXXCommand] привела к исключению и не будет повторена

Если другойМикросервис работает, затем команда обрабатывается правильно, без проблем.

У кого-нибудь есть идеи, в чем может быть проблема?

Это моя конфигурация для команды Gateway с RetryScheduler:

@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 Ответ

1 голос
/ 14 июня 2019

Чтобы решить эту проблему, вы можете предоставить собственную реализацию IntervalRetryScheduler, которая переопределяет метод IntervalRetryScheduler#isExplicitlyNonTransient(Throwable), чтобы учесть повторные попытки NoHandlerForCommandException.

Обратите внимание, чтоIntervalRetryScheduler намеренно повторяет попытки только для исключений типа AxonNonTransientException, которые обычно сигнализируют о восстанавливаемых исключениях.NoHandlerForCommandException означает, что используемая реализация CommandBus не имеет ни малейшего представления о том, кому отдавать команду, что обычно предполагает вещь, которую нельзя повторить.

Однако, похоже, у вас есть сценарий, когдаимеет смысл.Таким образом, как я отмечаю в начале, переопределение метода isExplicitlyNonTransient(Throwable) для исключения NoHandlerForCommandException будет для вас подходом, я думаю.

Надеюсь, это поможет вам!

...