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

1例发生错误后轴突粘连

羿博延
2023-03-14
processor_name   |   segment owner| timestamp                      | token             | token_type
myapps.projection|       0    far |  2021-02-03T02:22:46.6003318Z  | {"globalIndex":32}|  org.axonframework.eventhandling.GlobalSequenceTrackingToken

当我的@eventHandler抛出错误时,就会发生这种情况。

说明:我有两个事件,具有相同的用户名@EventHandler不能解决这个问题并抛出错误,因为用户名必须是唯一的

令牌:31,有效负载:{“id”:“D6554811-EE5A-46D5-973D-1D61EE71C7FE”,“fullname”:“xasxsax”,“用户名”:“xasxsaxsa”,“email”:“xasxsa@g.com”,“password”:“adminadmin”}

令牌:32,有效负载:{“id”:“b41efb71-14ee-4a5f-bdef-93b36e2e6a84”,“fullname”:“xasxsax”,“用户名”:“xasxsaxsa”,“email”:“xasxsa@g.com”,“password”:“adminadmin”}

我的问题是,是否有任何最佳实践来处理错误,这样其他事件就可以很好地工作,而无需等待修复此单个事件?或者有什么解决办法可以解决这个问题?

共有1个答案

董高洁
2023-03-14

假设您使用的是Axon4和默认的TrackingEventProcessor。这些事件形成一个流,因此您必须在处理下一个事件之前处理此事件;从@EventHandler抛出异常会告诉Axon您当前无法处理该事件。在这种特定的情况下,您可能只需要记录一个错误,而不是抛出,因为第二个事件根本没有意义--它要求创建已经存在的东西。

对于其他类型的失败事件,可能需要再次只记录错误并允许流继续,然后在修复了失败原因后重播事件。若要为单个聚合重播特定事件,可以执行如下操作:

@Autowired
EventStore eventStore;
    
@Test
public void testReplay() {
    
    String aggregateIdentifier = "1234";
    long startFrom = 0;
    String eventType = "org.sample.model.events.MyEvent";
    Class projectorClass = MyProjector.class;
    
    AnnotationEventHandlerAdapter eventHandlerAdapter = new AnnotationEventHandlerAdapter(projectorClass);
    DomainEventStream eventStream = eventStore.readEvents(aggregateIdentifier, startFrom);
    eventStream.asStream()
        .filter(event -> {
            // add any type of filtering based on the event here
            return event.getType() == eventType;
        })
        .forEach(event1 -> {
            try {
                eventHandlerAdapter.handle(event1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
}

您可以在操作接口中公开此方法,以允许您的操作团队在分析后重播特定事件。

 类似资料:
  • 我正在为我的公司调查可能的跨平台解决方案,我现在正在尝试代号为One的解决方案。我真的很喜欢它,但今天我创建了一个hello world项目,当我尝试构建服务器时,我得到了一个错误。我还尝试了iOS版本,我得到了同样的错误。下面是我得到的异常: 这是我在build.xmlAndroid设置: 我认为这可能是不相关的,因为它是一个我不关心的构建,并且可能不会被解析,但在我的windows部分buil

  • 将一个旧项目上的Gradle更新为最新版本,我收到以下错误:。gradle\caches\transforms-1\files-1.1\CreditCardEntry-1.4.8.10。aar\453339e1f1fb2382e8ce2362a0acdedd\res\values\values。xml:11:5-54:AAPT:error:内部元素必须是资源引用或为空。 我不明白为什么会出现这个错

  • 我试图使用Eclipse在http://projects.spring.io/spring-framework/运行Spring框架“快速入门”教程 我首先在Eclipse中构建了一个Maven项目,并添加了三个. java文件。代码如下 然后我右键单击Eclipse并选择“作为运行” > 错误:发生了JNI错误,请检查您的安装并重试 发生Java异常。 控制台显示 线程“main”java.la

  • 我不知道如何恰当地问这个问题,但它是这样的: 我在特定事件上开始了传奇,然后我调度命令,该命令应该创建一些聚合,然后发送另一个事件,该事件将由传奇处理,以继续逻辑。 但是,每次我重新启动应用程序时,我都会得到一个错误,说序列x处的聚合事件已经插入,我想这是因为这个传奇还没有完成,当我重新启动它时,它会通过尝试创建新的聚合来再次启动它。 谢谢

  • 使用Dynamics 365版本1612(8.2.2.112)在premises。在Quote表单上,我修改了Activate Quote调用的操作,以创建自定义实体(交易)记录,然后导航到新创建的记录。直到两周前,这在所有浏览器中都运行得很好。现在,它在IE中不起作用(客户端优先--但在Chrome、Firefox和Edge中起作用),我得到的只是一些通用的JSON错误。“无效的JSON。在JS

  • null 我设置应用程序的方式是使用aggregateview将所需数据持久化到数据库中。因此,现在我感觉事件只是存储在事件存储区中,并且只在调用命令后用于重新创建聚合。对于正在存储的事件和集合的重新创建,我难道没有其他事情要做吗?例如,我是否应该重新创建整个聚合,而不是按ID从数据库中取出aggregateview来更新它。