如何覆盖PersistenceTestKit配置实现自定义journal及TestJournal查询
PersistenceTestKit相关问题解答
配置被忽略的原因
PersistenceTestKit在设计上对持久化核心插件配置做了强制覆盖,优先级高于用户传入的自定义配置:默认会强制将akka.persistence.journal.plugin绑定到内置的akka.persistence.testkit.journal,同时也会覆盖快照存储、事件序列相关的默认配置,这就是你传入的自定义journal配置不生效、Settings中查不到对应配置项的原因,属于框架的默认行为,不是配置解析的问题。
获取TestJournal实例及支持的消息
不需要自行实现FakeJournal,可直接通过ActorSystem获取内置TestJournal的ActorRef,路径为:akka://<你的ActorSystem名称>/system/testKit/journal。
TestJournal支持的核心交互消息如下,所有消息均属于akka.persistence.testkit.journal包:
ClearAll:清空journal中存储的所有事件,多用于测试用例执行前的环境初始化Drop(n: Int):主动丢弃最近写入的n条事件,可用于模拟写入失败场景ExpectedEvents(persistenceId: String, expected: Seq[Any]):校验指定持久化ID下存储的事件是否和预期序列完全一致,直接返回校验结果ReadEvents(persistenceId: String, fromSeqNr: Long, toSeqNr: Long, max: Long):主动拉取指定持久化ID、指定序号范围的事件,可直接满足基础的查询需求PersistPayload(persistenceId: String, sequenceNr: Long, payload: Any):手动向journal中插入指定的事件,可用于构造测试前置数据
实现Journal查询功能的方案
如果内置的ReadEvents消息无法满足复杂查询需求,可按以下方案扩展查询能力,不需要替换内置TestJournal:
- 自定义查询服务实现类,在类内部持有TestJournal的ActorRef,在业务查询方法中向TestJournal拉取全量事件后自行做过滤、聚合、范围查询等逻辑
- 在配置中添加条目
akka.persistence.query.journal.test.class = "<你的自定义查询实现类全限定名>",该配置不会被PersistenceTestKit覆盖,可正常注册到Akka Persistence Query扩展 - 测试代码中直接通过
PersistenceQuery(system).readJournalFor[你的自定义查询类]("akka.persistence.query.journal.test")获取查询实例调用即可
内容的提问来源于stack exchange,提问作者Thomas Eyde
相关产品推荐
相关产品推荐

