我一直在尝试用函数式方法来实现持久 Actor - 我的意思是根本没有变量。但我遇到了麻烦:) 下面的代码示例无法正常工作,因为处理程序参数不在处理程序之间共享(receiveCommand/receiveRecover)。两者都以零开头,然后互相覆盖 - 重播一些事件后,命令处理程序仍将处于起始点。
此实现的另一个问题是在同一位置处理命令和事件
以函数式方式实现它是一个好的做法吗?
class Item(sku: String) extends PersistentActor with ActorLogging {
import Item._
override def persistenceId: String = sku
override def receiveCommand: Receive = handler(0, 0)
override def receiveRecover: Receive = handler(0, 0)
def handler(quantity: Int, booked: Int): Receive = {
case Increase(q) =>
val event = StockChanged(sku, q)
persist(event)(e => context.become(handler(quantity + e.quantity, booked)))
case Decrease(q) =>
val event = StockChanged(sku, -q)
persist(event)(e => context.become(handler(quantity + e.quantity, booked)))
case StockChanged(_, q) => {
context.become(handler(quantity + q, booked))
}
}
}
最佳答案
我已经找到答案了。新的 akka persistence 2.6 只是以功能方式工作:)
https://doc.akka.io/docs/akka/current/typed/persistence.html#event-sourcing
关于scala - Akka 持久 Actor - 函数式方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59022422/