如何在外部触发 PersistentView 更新

How to trigger a PersistentView update externally

根据 the docs,从外部触发视图更新应该像这样工作:

view ! Update(await = true|false)

虽然发送和等待似乎不起作用:

view ! Update(await = true) // repeat x times does not help either
Thread.sleep(2000)
val getState = view ? GetState

视图状态未更新。

询问也不起作用 - Update 没有答案并且 Await 超时:

val getUpdate = v ? Update(await = true)
val updated = Await.result(getUpdate, 10 seconds)
val getState = view ? GetState

IIUC,Update 消息的处理由 PersistentView#State#stateReceive 执行。它的接收没有记录,我不知道如何验证接收和处理。 Update 消息没有到达我的 PersistentView 中覆盖的 receive

有效的方法是在 .conf:

中设置一个非常短的刷新间隔
persistence.view.auto-update-interval = 100ms

调试日志显示日志正在更新视图:

... a.p.i.e.InMemoryJournalStorage akka://entityViewSpec/user/JournalStorage - received handled message GetJournalEntriesExceptDeleted(ea-ZleUNl1a3N,1,1,9223372036854775807) from Actor[akka://entityViewSpec/temp/$o]

发送 Update 和等待

时我没有看到此日志条目

短暂休眠后,视图如期更新。

Thread.sleep(200)
val getState = view ? GetState

那么如何在不一直 运行 自动更新的情况下从外部触发视图更新?

阿卡 2.4.8

谢谢

编辑

我的错误很简单 - 没有给初始消息足够的时间来保留 - Update 调用是在商店还没有相关事件的时候收到的。自动更新设置在更新前等待 100 毫秒。在具有内存持久性的本地计算机上,我需要在调度 Update 之前留出大约 50 毫秒的时间。然后给系统一些时间来获取和应用事件:

不工作:

actor ! MyCommand
view ! Update(await = true)
Thread.sleep(500)
val getState = view ? GetState

工作:

actor ! MyCommand
Thread.sleep(50)
view ! Update(await = true)
Thread.sleep(500)
val getState = view ? GetState

我已尝试重现您的问题,但我的观点已刷新:/ 检查我的例子:https://github.com/kpbochenek/akka-playground

运行 MyPersistentView.scala

自动更新已关闭

我可以在日志中看到(View actor 接收到由 persistent actor 保存的消息):

00:11:35.325 [pw-akka.actor.default-dispatcher-5] INFO  com.kpbochenek.MyActor - persisted! AAAAAAAA
00:11:35.326 [pw-akka.actor.default-dispatcher-9] INFO  com.kpbochenek.MyActor - persisted! 11111111
00:11:37.254 [pw-akka.actor.default-dispatcher-4] INFO  com.kpbochenek.MyView - VIEW READ AAAAAAAA
00:11:37.255 [pw-akka.actor.default-dispatcher-4] INFO  com.kpbochenek.MyView - VIEW READ 11111111