根据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
msgs未在我的receive
中覆盖PersistentView
覆盖。
在.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
那么如何在不运行自动更新的情况下从外部触发视图更新?
Akka 2.4.8
谢谢
修改
我的错误非常简单 - 没有给予初始消息足够的时间来保持持久性 - 当时尚未从商店获得相关事件时收到Update
电话。自动更新设置在更新前等待100毫秒。在具有内存持久性的本地计算机上,我需要在调度Update
之前允许大约50ms。然后给系统一些时间来获取和应用事件:
不工作:
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
答案 0 :(得分:1)
我尝试重新创建您的问题,但我的视图已刷新:/ 查看我的示例:https://github.com/kpbochenek/akka-playground
运行MyPersistentView.scala
自动更新已关闭
我可以在日志中看到(View actor接收持久化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