在Lagom中,當命令處理程序必須執行一些異步操作時,你會做什麼?例如:Lagom:命令處理程序中的異步操作
override def behavior = Actions().onCommand[MyCommand, Done] {
case (cmd, ctx, state) =>
// some complex code that performs asynchronous operations
// (for example, querying other persistent entities or the read-side
// by making calls that return Future[...] and composing those),
// as summarized in a placeholder below:
val events: Future[Seq[Event]] = ???
events map {
xs => ctx.thenPersistAll(xs: _*) {() => ctx.reply(Done) }
}
}
與這樣的代碼的問題是,編譯器期望的命令處理程序返回Persist
,不Future[Persist]
。
這樣做的目的是爲了確保事件以正確的順序持續存在(也就是說,事先生成的事件必須保存在事件之後)。但是不能通過適當管理事件補償來處理,以便日記總是正確地命令它們,而不管它們何時實際保存?
在這種情況下,當命令處理足夠複雜以至於需要從命令處理程序進行異步調用時,會發生什麼情況?
這一切都很好,但是當一個聚合可以引用另一個聚合內的實體(並且一般!)時,刪除級聯的一致性邊界就變成了整個世界。當然,除非完全禁用刪除,這可能是一種選擇。 – silverberry
命令濃縮是另一種選擇。謝謝。 – silverberry
我想我可以做preDelete來收集所有防止刪除的實體或所有必須通過級聯刪除/更新的實體,然後纔會實際發出執行這些操作的命令。 – silverberry