Axon Framework, реализующий IntervalRetryScheduler только для некоторых команд

У меня есть сага, и сага отправляет команды в разные микросервисы при определенных событиях. Некоторые из микросервисов могут быть недоступны в большей степени, чем другие, поэтому я хочу настроить CommandGateway с помощью RetryScheduler, а также реализовать свой собственный IntervalRetryScheduler, чтобы я мог повторять попытку для каждого RuntimeException, но только для некоторых команд Axon (это было большая помощь Почему RetryScheduler в Axon Framework не пытается повторить попытку после исключения NoHandlerForCommandException?).

Все работает, как ожидалось, меня беспокоит только то, что есть какие-либо проблемы, связанные с тем, что некоторые команды будут отправлены с помощью CommandGateway по умолчанию, а некоторые - с моим настраиваемым CommandGateway, в который встроена настраиваемая повторная попытка?

На данный момент я бы не стал использовать пользовательский CommandGateway даже для команд без повторной попытки.

Я пошел с отличным подходом к бобам CommandGateway

    @Bean
    public CommandGateway commandGateway(){
        Configurer configurer = DefaultConfigurer.defaultConfiguration();
        CommandBus commandBus = configurer.buildConfiguration().commandBus();
        CommandGateway commandGateway = DefaultCommandGateway.builder().commandBus(commandBus).build();
        return commandGateway;
    }

    @Bean
    public CommandGateway commandGatewayWithRetry(){
        Configurer configurer = DefaultConfigurer.defaultConfiguration();
        CommandBus commandBus = configurer.buildConfiguration().commandBus();
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
        RetryScheduler rs = IntervalRetrySchedulerImpl.builder().retryExecutor(scheduledExecutorService).maxRetryCount(5).retryInterval(1000).build();
        CommandGateway commandGateway = DefaultCommandGateway.builder().commandBus(commandBus).retryScheduler(rs).build();
        return commandGateway;
    }

person bluesony    schedule 12.09.2019    source источник


Ответы (1)


Есть пара углов, которые вы можете взять отсюда.

Если вы настроены на использование идеи _1 _ / _ 2_, вы можете выполнить одно из следующих действий.

  • Настройте отдельные CommandGateway beans, либо с нашим без RetryScheduler
  • Укажите конкретный тип исключения, создаваемого из саг для повторных попыток, чтобы ваш RetryScheduler мог настроить повторные попытки «да» или «нет».
  • Создайте собственный командный шлюз (как описано в здесь). С этого момента вы можете быть настолько конкретны, насколько захотите, когда дело доходит до того, как ведут себя определенные команды.

Однако я думаю, что решение, предложенное в этом сообщении Axon Usergroup было бы более целесообразно следовать в вашей ситуации. Подводя итог предлагаемому подходу, идея состоит в том, чтобы запланировать повторную попытку в самой саге, используя Крайний срок, предоставленный Axon.

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

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

person Steven    schedule 12.09.2019
comment
Я придерживался особого подхода к компонентам CommandGateway. Добавил их в свой первоначальный вопрос. Вам нравится NO-RETRY CommandGateway? Я имею в виду, то же самое и со стандартным CommandGateway? - person bluesony; 12.09.2019
comment
Совершенно нормально @sodomark! Уловка сделана за вас, и с точки зрения использования это нормально. Я бы сказал, дерзай. - person Steven; 13.09.2019