Axon框架重试逻辑

时间:2019-07-15 16:53:09

标签: spring-boot axon

我正在尝试使用Axon 4.1+中的eventProcessingModule在2个JVM节点K8集群上进行重播事件。虽然我将它设置为清除事件,但它仅从一个节点中拾取它,而另一个保持运行,因为它的跟踪事件仍然有效。

我该如何同时在所有JVM中禁用它,以便可以正确重播?然后启用所有功能以继续处理命令。

我试图通过此代码提升线程,这导致另一个问题,除非我从数据库中完全删除了令牌,否则现有令牌在InitialSemgmentsCount中永远不会增加。

    public void config(final EventProcessingConfigurer configurer) {
        configurer.registerTrackingEventProcessorConfiguration(c ->
                TrackingEventProcessorConfiguration
                        .forParallelProcessing(2)
                        .andInitialSegmentsCount(2));
        // .andTokenClaimInterval(10L, TimeUnit.SECONDS)); // Event
    }

我当前的设置:

# Application.yml
axon:
  distributed:
    enabled: true

具有以下内容的服务组件:

自动连接到EventProcessingConfiguration eventProcessingModule

eventProcessingModule
        .eventProcessorByProcessingGroup("query.skuProcessor.SkuProjection", TrackingEventProcessor.class)
        .ifPresent(trackingEventProcessor -> {
            trackingEventProcessor.shutDown();
            trackingEventProcessor.resetTokens();
        });

// Thread.sleep() to verify with

eventProcessingModule
        .eventProcessorByProcessingGroup("query.skuProcessor.SkuProjection", TrackingEventProcessor.class)
        .ifPresent(trackingEventProcessor -> {
            trackingEventProcessor.start();
        });

示例代码在单个shutdownDown / reset / start设置中具有以上内容,但我将它们拆分只是为了查看其工作方式(相信@ResetHandler在Reset之后被调用,因此Start等待,但不能完全确定)< / p>

具有@ResetHandler无效方法的SkuProjection组件,用于清理要重播的表。

取决于当前哪个JVM具有令牌,另一个将返回此错误: SkuReplayService.startReplay: Failed on exception! Unable to claim token 'query.skuProcessor.SkuProjection[0]'. It is owned by '1@sku-7694bbc6b6-8p958'

我认为token_entry表在所有者“停止”时将变为“空”,但是由于有2个JVM,因此当前没有令牌的JVM将接管它,而其他重放。在第一个节点停止其处理器之后,确认第二个节点正在使用令牌运行。

1 个答案:

答案 0 :(得分:0)

我想我可以在这里给您一些指导。

您正在研究如何将操作委托给跨多个JVM的一组特定的跟踪事件处理器,对吗? 现在,API Axon框架为您提供TrackingEventProcessor方面的信息,并且是有意维护在TrackingEventProcessor上的。

因此,执行start()shutDown()processingStatus()resetTokens()是对特定跟踪事件处理器实例的调用。

  

注意:resetTokens()方法将有效地对由跟踪事件处理器负责的事件处理程序发出重播。

此外,您还会看到Unable to claim token异常,因为框架要求您执行重置的TrackingEventProcessor是给定处理组的所有令牌的所有者。这样做的原因是,它需要将令牌调整为ReplayTokens才能支持@ResetHandler之类的精美功能。

如果我是正确的话,您现在要的是:

  

Axon Framework是否提供将特定的跟踪事件处理器操作委派给所有正在处理同一处理组的实例的方法?

@sherring,我想我不得不在这里令您失望,Axon Framework没有提供委派此类操作的方法。 实现这些委托启动/停止/重置操作的最快方法是设置Axon Server,因为标准版(免费)已经为您提供了此功能。

如果出于某种原因该免费软件无法使用,则意味着您必须自己为start / stop / reset / {insert-any-TrackingEventProcessor-operation}创建这样的委派系统。或者,您可以从操作角度进一步处理此问题。因此,关闭给定的Axon Framework应用程序的第二个实例,确保仅一个TrackingEventProcessor实例要重置。

希望这可以帮助您@sherring!