Akka:currentEventsByPersistenceId返回的eventEnvelope.timestamp始终为0
问题分析与解决方案
核心原因
这种现象通常和你使用的Akka Persistence ReadJournal实现(如Akka Persistence JDBC)的版本或查询逻辑差异有关:
- 以Akka Persistence JDBC为例,早期版本(如4.x及以下)中,
currentEventsByPersistenceId的查询逻辑直接从messages表读取数据,但并未将表中的timestamp字段映射到EventEnvelope.timestamp,导致返回值固定为0。 - 而
currentEventsByTag查询是从专门的tag_read_journal表读取,该表结构设计包含timestamp字段,因此能正确填充EventEnvelope.timestamp。
解决方案
1. 升级ReadJournal依赖版本
如果使用的是Akka Persistence JDBC,升级到5.0.0及以上版本,该版本修复了currentEventsByPersistenceId查询不返回timestamp的问题。调整构建文件中的依赖(以sbt为例):
libraryDependencies += "com.lightbend.akka" %% "akka-persistence-jdbc" % "5.1.0"
2. 临时替代方案(无法升级时)
如果暂时无法升级依赖,可以通过currentEventsByTag结合过滤逻辑获取指定persistenceId的事件,虽然效率略低,但能拿到正确的timestamp:
val targetPid = "your-target-persistence-id" val allEvents: Source[Any, NotUsed] = readJournal .currentEventsByTag("specific-tag", NoOffset) .filter(_.persistenceId == targetPid) .map { eventEnvelope => logger.info(s"timestamp = ${eventEnvelope.timestamp}, PID = ${eventEnvelope.persistenceId}, SEQ = ${eventEnvelope.sequenceNr}") eventEnvelope.event }
3. 验证配置正确性
确认你的ReadJournal配置中已正确启用timestamp存储(此步骤为排查补充,你提到messages表已有正确值,大概率配置无问题):
akka.persistence.jdbc.journal.timestamp-provider = "akka.persistence.jdbc.journal.TimestampProvider$DefaultTimestampProvider"
内容的提问来源于stack exchange,提问作者Sreehari
相关产品推荐
相关产品推荐

