Axon Token [IndexTrackingToken{globalIndex=2}] 类型错误

Axon Token [IndexTrackingToken{globalIndex=2}] is of the wrong type

我正在从 axon 2 更改为 axon 4,我正在使用 spring 基于引导的配置,其中包含 axon-spring-boot 和 mysql DB。

在我的应用程序属性中 我添加了这个配置

axon.serializer.general = XSTREAM
axon.serializer.events= XSTREAM`enter code here`
axon.serializer.messages=XSTREAM

这是我在日志中得到的异常

org.axonframework.eventhandling.TrackingEventProcessor Error occurred. Starting retry mode.
java.lang.IllegalArgumentException: Token [IndexTrackingToken{globalIndex=2}] is of the wrong type. Expected [GapAwareTrackingToken]
    at org.axonframework.common.Assert.isTrue(Assert.java:56)
    at org.axonframework.eventsourcing.eventstore.jpa.JpaEventStorageEngine.fetchTrackedEvents(JpaEventStorageEngine.java:137)
    at org.axonframework.eventsourcing.eventstore.BatchingEventStorageEngine.lambda$readEventData(BatchingEventStorageEngine.java:123)
    at org.axonframework.eventsourcing.eventstore.BatchingEventStorageEngine$EventStreamSpliterator.tryAdvance(BatchingEventStorageEngine.java:236)
    at java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState[=11=](StreamSpliterators.java:294)
    at java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:206)
    at java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161)
    at java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:300)
    at java.util.SpliteratorsAdapter.hasNext(Spliterators.java:681)
    at org.axonframework.eventsourcing.eventstore.EmbeddedEventStore$EventConsumer.peekPrivateStream(EmbeddedEventStore.java:397)
    at org.axonframework.eventsourcing.eventstore.EmbeddedEventStore$EventConsumer.peek(EmbeddedEventStore.java:356)
    at org.axonframework.eventsourcing.eventstore.EmbeddedEventStore$EventConsumer.hasNextAvailable(EmbeddedEventStore.java:333)
    at org.axonframework.common.stream.BlockingStream.hasNextAvailable(BlockingStream.java:40)
    at org.axonframework.eventhandling.TrackingEventProcessor.checkSegmentCaughtUp(TrackingEventProcessor.java:270)
    at org.axonframework.eventhandling.TrackingEventProcessor.processBatch(TrackingEventProcessor.java:216)
    at org.axonframework.eventhandling.TrackingEventProcessor.processingLoop(TrackingEventProcessor.java:181)
    at org.axonframework.eventhandling.TrackingEventProcessor$TrackingSegmentWorker.run(TrackingEventProcessor.java:661)
    at org.axonframework.eventhandling.TrackingEventProcessor$WorkerLauncher.run(TrackingEventProcessor.java:771)
    at org.axonframework.eventhandling.TrackingEventProcessor$CountingRunnable.run(TrackingEventProcessor.java:588)
    at java.lang.Thread.run(Thread.java:748)

任何帮助将不胜感激

你看到的是 JpaEventStorageEngine 抱怨你给它一个 GlobalSequenceTrackingTokenGlobalSequenceTrackingTokentoString() 方法声明 "IndexTrackingToken{" + "globalIndex=" + globalIndex + '}'),而它需要 GapAwareTrackingToken.

发生这种情况的可能情况是您最初使用 Axon Server 启动您的应用程序,它使用 GlobalSequenceTrackingToken,现在正在从 Axon Server 作为您的事件存储转向个人维护的 RDBMS 设置使用 JPA。

我怎么看,你有两种方法可以解决这个问题:

  1. 继续使用 Axon 服务器,因为这样可以节省配置数据库的时间(因为您根本不必配置它),这也将解决这个差异。
  2. 从您的 token_entry table 中删除现有的 GlobalSequenceTrackingToken,以便 Axon 可以在 GapAwareTrackingToken.
  3. 中替换它们

假设您有意识地远离 Axon 服务器,我认为您会选择选项 2。这样做时,初始化您的 GapAwareTrackingToken 以在同一点开始可能是有益的GlobalSequenceTrackingTokens 在。

查看 TrackingEventProcessorConfiguration 以指定给定跟踪事件处理器的初始标记。

如果您仍处于迁移的开发阶段,我想您可以将这些令牌完全丢弃到安全时间。