You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:35:20