当前位置: 首页 > 知识库问答 >
问题:

Axon框架只为某些命令实现IntervalRetryScheduler

柴文林
2023-03-14

目前,我不会使用自定义CommandGateway,即使是不重试的命令

我使用了不同的CommandGateway bean方法

    @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;
    }

共有1个答案

欧阳洲
2023-03-14

从这里开始,你可以从几个角度出发。

如果设置为使用RetryScheduler/CommandGateway思想,则可以执行以下任一操作。

  • 配置不同的commandgatewaybean,或者使用我们的bean,而不使用RetryScheduler
  • 具体说明重试时从SAGA引发的异常类型,以便RetryScheduler可以调整为重试yes或No。
  • 构建一个自定义命令网关(如本文所述)。从那以后,当涉及到某些命令的行为时,您可以想怎么具体就怎么具体。

但是,我认为在Axon Usergroup的这篇文章中建议的解决方案在您的情况下更值得遵循。总结一下建议的方法,这个想法是通过使用Axon提供的最后期限机制来安排Saga本身的重试。

这样,如果微服务不可用(我假设这就是您试图解决的问题),您就可以让命令失败,并在一定时间后让Saga本身重试操作。

希望这能帮到你!

 类似资料:
  • 我正在研究Axon框架,我很难理解命令状态的自动持久性。 我已经查看了有关命令模型存储库的文档,根据我的理解,只要有正确的依赖关系,标准存储库的命令模型的状态应该是自动持久化的。这种观点也出现在我看过的另一篇博客/教程中(您可能需要向下滚动到存储库部分)。 更新 根据Steven的注释(以及随后的注释),我决定尝试并实现一个状态存储的聚合,但是我发现聚合的(de)序列化存在一个问题。我已经将聚合发

  • 让我们举一个电子邮件传奇的例子:当一个用户注册时,我们创建一个发布UserRegisterEvent的用户聚合,一个传奇将被创建,这个传奇负责确保注册电子邮件被发送给用户(电子邮件可能包含验证密钥、欢迎消息等)。 我们是否应该使用: > 用try/catch->缩放吗? 使用deadline是因为我们只使用“send”,而不处理命令的最终错误,这可能是发送失败(其他服务关闭,等等) 其它的呢? 还

  • 我试图使用Axon 4.1+中的在一个2 JVM node K8集群上重播事件。虽然我将它设置为清理事件,但它只从一个节点中提取事件,而另一个节点继续运行,因为它的跟踪事件仍然是活动的。 我如何在所有JVM上同时禁用它,以便它能够正确地重播?然后启用所有这些命令,继续处理命令。 我尝试通过这段代码增加线程,这导致了另一个问题,即现有的令牌在InitialSemgmentsCount中永远不会增加,

  • null 我想要达到的目标 我希望由一个实例发布的事件只由同一个实例处理 如果instance1发布eventX,那么只有instance1应该处理eventX null

  • 任何关于如何做到这一点的文件都将不胜感激。 提前谢了。