如何在外部触发PersistentView更新

时间:2016-08-03 17:26:23

标签: scala akka akka-persistence

根据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

视图状态未更新。

提问也不起作用 - UpdateAwait时间没有答案:

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

1 个答案:

答案 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