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

从已在DeadlineHandler中使用sequence的EventStoreException中恢复

束敏学
2023-03-14
timestamp                      | aggregate_id                         | seq | type
                               |                                      |     |
2020-11-30T15:14:51.345541552Z | b02a5364-ee34-431a-ab1a-6c59bb937845 | 0   | MyAggregate
2020-11-30T15:14:52.06794746Z  | b02a5364-ee34-431a-ab1a-6c59bb937845 | 1   | MyAggregate

异常详细信息:

java prettyprint-override">org.axonframework.eventsourcing.eventstore.EventStoreException: An event for aggregate [b02a5364-ee34-431a-ab1a-6c59bb937845] at sequence [1] was already inserted

java.sql.BatchUpdateException: Batch entry 0 INSERT INTO events 
(event_id, aggregate_id, sequence_number, type, timestamp, payload_type, payload_revision, payload, metadata) 
VALUES 
('d5be369e-5fd0-475e-b5b6-e12449a4ed04',
'b02a5364-ee34-431a-ab1a -6c59bb937845',
1,
'MyAggregate',
'2020-11-30T15:14:52.067871723Z',
'MyEvent',
NULL,
'{"payload":"payload"}',
'{"metaData":"metaData"}') 
was aborted: ERROR: duplicate key value violates unique constraint "uk_aggregate_identifier_sequence_number"
  Detail: Key (aggregate_id, sequence_number)=(b02a5364-ee34-431a-ab1a-6c59bb937845, 1) already exists.

如您所见,事件的时间戳几乎相同:
eventa:2020-11-30t15:14:52.006794746zeventb:2020-11-30t15:14:52.067871723z

共有1个答案

阳兴文
2023-03-14

首先回答您的问题,验证propagatingerrorhandler没有帮助,因为TrackingEventProcessor不会重试deadlineMessage。它只适用于重试真实事件,而deadlineMessage不是这种情况,因为它不是事件。

对于您的问题,我们假设您的Saga有一个DeadlineHandler,并且该组件正在向您的聚合发送一个命令,同时另一个组件也在向同一个聚合发送一个命令。这样,聚合无法处理第二个命令。基于此,我们可以给你两点建议:

  • 具有一致的路由策略,该策略由CommandBus的分布式实现使用。简而言之,它将为您提供以下内容:

具有相同路由键的两个命令将始终路由到同一段。

  • CommandGateway上配置RetryScheduler。您可以在这里阅读更多关于它的信息。

RetryScheduler能够在命令执行失败时调度重试。

 类似资料:
  • 本文向大家介绍详解Python3中的Sequence type的使用,包括了详解Python3中的Sequence type的使用的使用技巧和注意事项,需要的朋友参考一下 其实本来是要reverse一下list的,就去查了一下list[::-1]是什么意思,发现还有很多要注意的地方,所以就记一下。 主要是参照https://docs.python.org/3/library/stdtypes.ht

  • 正如名字一样,这个(recover)内建函数被用于从 panic 或 错误场景中恢复:让程序可以从 panicking 重新获得控制权,停止终止过程进而恢复正常执行。 recover 只能在 defer 修饰的函数(参见 6.4 节)中使用:用于取得 panic 调用中传递过来的错误值,如果是正常执行,调用 recover 会返回 nil,且没有其它效果。 总结:panic 会导致栈被展开直到 d

  • 我尝试用Spring将Angular表单发送的数据恢复到java方法中。我的代码如下: app.js formData的值: 我还有三个bean,Form、Object1和Object2,每个bean都有一个空的contructor和共同响应的getter和setter。 今天,我在myController中输入object表单不是null,但它的两个字段(object1和object2)是nul

  • 问题内容: 我有一个处理我的应用程序登录的简单片段。由于我正在处理登录请求,因此我不想缓存它们。在我在请求中间引入暂停或方向更改之前,该策略可以正常工作。当用户单击登录按钮时,我将显示一个ProgressDialog。当我得到响应(成功或失败)时,这消失了。如果我进入主屏幕,然后在登录请求过程中返回到应用程序,则我的侦听器将永远不会收到通知,因此我的ProgressDialog不会被关闭并且我的应

  • 问题内容: 我想通过Java从磁盘恢复文件而不使用本机库 我正在使用Java 8进行此操作 据我所知,已删除的文件会保留在磁盘上,直到被覆盖为止 我可以直接访问Linux上的磁盘,并且可以读取原始数据,但是,例如,如何解析ext4或NTFS文件系统上的已删除文件? 谢谢。 问题答案: 要恢复已删除的文件,需要了解底层文件系统的实现方式,因此您需要做一些阅读工作,然后才能到达任何地方。 从理论上讲,

  • 问题内容: 好,我有问题。如果在处理HTTP请求时发生未捕获的异常,则我没有机会在http.ServerResponse对象上调用end()方法。因此,服务器将永远挂起并且永远不会满足该请求。 这是一个例子: 如果访问/ error,则会发生异常,但会被捕获。用户收到错误消息-没问题。但是,如果我访问/ hang,服务器最终将抛出未捕获的异常并永远挂起。以后对/ hang的任何请求都将挂起。 糟透