0

我目前正在尝试从 AxonDB 事件存储中读取所有事件并将它们导出到 CSV 文件。选择的方法是在附加到 AxonDB 服务器的 Spring Boot 应用程序中创建一个 EventHandler。将 TrackingEventProcessor 与 InMemoryTokenStore(默认)一起使用,我希望每次启动这个小应用程序时都从事件存储中读取所有事件。

不幸的是,我没有在我的 TrackingEventProcessor 中收到来自 AxonDB 客户端的事件,这让我困惑了几个小时。我走进了野兽的肚子,看到了以下行为,我想讨论一下:

  • 首先,我使用的是原始应用程序(填充事件存储)也使用的所有相同版本:
    • 轴突数据库 1.3
    • axonDB 客户端 1.3
    • 轴突框架 3.2.1
  • 应用通过 gRPC 成功连接到 AxonDB
  • AxonDBEventStore 读取一堆事件
    • 2018-08-16 13:56:49.337 DEBUG 27781 --- [ault-executor-0] i.a.axondb.client.axon.AxonDBEventStore : Received event with token: 17742ETC
  • 我的 TrackingEventProcessor 以 Segment[0/0] 开始,这对我来说似乎是正确的,因为我使用了 InMemoryTokenStore
    • 2018-08-16 14:18:50.190 INFO 30006 --- [t-projection]-0] o.a.e.TrackingEventProcessor : Fetched token: null for segment: Segment[0/0]
  • TrackingEventProcessor 开始运行并尝试传递以下语句(来自版本 3.2.1 中的源代码第 248 行):
    • if (eventStream.hasNextAvailable(1, SECONDS))
    • 上面的检查总是返回'false',因为eventStream(来自AxonDB客户端的EventBuffer)的实现总是没有结果。

我已经咬了一段时间的灰尘,并认为我已经走到了死胡同。我没有收到任何错误消息或异常。读取事件似乎有效,通过 AxonDBEventStore 日志记录确认。但在此之后,EventBuffer 保持为空,因此我的处理器甚至无法检查它是否应该处理它所呈现的事件。因此,我想我的处理器的名称在这里不会是问题。我尝试了几个处理器名称(与事件中的数据匹配),但没有任何运气。反序列化似乎确实有效,因为我昨天在调试期间在某处发现了一个反序列化事件(虽然不记得在哪里......)。它看起来和我预期的一样。

有谁知道这里可能是什么问题?

4

3 回答 3

1

您能否尝试将 AxonDB 客户端升级到 1.3.1 版本,因为 1.3 版本在没有定义向上转换时出现问题。

请让我知道这可不可以帮你。

问候,

马克·加蒂尔

于 2018-08-16T16:45:51.077 回答
1

您提到您有两个不同的应用程序。在那些共享核心 API(命令、事件和查询)的应用程序之间,您是否有一个通用模块?如果情况并非如此,您的事件的完全限定名称是否匹配(一个在发布应用程序中,一个在消费应用程序中)?如果事件的完全限定名称不匹配,跟踪事件处理器将无法获取它。

让我知道这是否对您有帮助!

干杯,米兰。

于 2018-08-17T13:25:07.860 回答
0

不幸的是,由于找到了另一种解决问题的方法,我一直无法完成这个软件。我怀疑该事件没有出现在 TrackingEventProcessor 中,因为我的项目中没有事件的 POJO 表示,就像米兰建议的那样。

我最初的意图是创建一个通用工具来通过 Spring 应用程序将 GenericEventMessage 重写为 CSV,而不是为我正在处理的项目编写特定工具。可能这是不可能的,TrackingEventProcessor 需要类路径上的 POJO 来生成 GenericEventMessage。这是我之前没有想到的。

于 2018-12-05T11:40:10.760 回答