如何在外部触发 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
根据 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