0

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

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味精没有到达receive我的PersistentView.

起作用的是在 a 中设置一个非常短的刷新间隔.conf

persistence.view.auto-update-interval = 100ms

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

... 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 毫秒。在具有 in-mem 持久性的本地计算机上,我需要等待大约 50 毫秒,然后再发送Update. 然后给系统一些时间来获取和应用事件:

不工作:

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
4

1 回答 1

1

我试图重新创建您的问题,但我的视图已刷新:/ 检查我的示例:https ://github.com/kpbochenek/akka-playground

MyPersistentView.scala

自动更新已关闭

我可以在日志中看到(查看参与者接收持久参与者持久的消息):

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
于 2016-08-03T22:18:16.163 回答