首页 > 解决方案 > Axon Token [IndexTrackingToken{globalIndex=2}] 类型错误

问题描述

我正在从 axon 2 更改为 axon 4,我在其中使用基于 spring boot 的配置以及 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$1(BatchingEventStorageEngine.java:123)
    at org.axonframework.eventsourcing.eventstore.BatchingEventStorageEngine$EventStreamSpliterator.tryAdvance(BatchingEventStorageEngine.java:236)
    at java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState$0(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.Spliterators$1Adapter.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)

任何帮助,将不胜感激

标签: axon

解决方案


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

发生这种情况的可能情况是,您最初使用 Axon Server 启动应用程序,该GlobalSequenceTrackingToken服务器使用 .

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

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

假设您有意识地离开 Axon Server,我认为您会选择选项 2。这样做时,将您GapAwareTrackingToken的 s 初始化为从 s 所在的同一点开始可能是有益GlobalSequenceTrackingToken的。

查看TrackingEventProcessorConfiguration为给定的跟踪事件处理器指定初始令牌。

如果您仍处于迁移的开发阶段,我认为您可以完全放弃这些令牌以确保安全。


推荐阅读