在 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]
。
这是故意这样做的,以确保事件以正确的顺序保存(即,先前命令生成的事件必须在后面命令生成的事件之前保存)?但是,这不能通过对事件偏移量的适当管理来处理,以便日志总是正确地对它们进行排序,而不管它们何时实际保存?
当命令处理复杂到需要从命令处理程序进行异步调用时,在这种情况下该怎么办?