scala - Akka 持久 Actor - 函数式方法

标签 scala functional-programming akka actor

我一直在尝试用函数式方法来实现持久 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/

相关文章:

web-applications - 如何检测 Racket Web 应用程序上的按键?

javascript - 映射添加/减少具有相同索引的两个数组对象

scala - 如何获取 Akka 中现有 ActorSystem 的引用?

scala打印字长直方图scala

scala - 为什么 scala 编译器在重载且具有泛型类型参数时无法找到隐式参数值/转换?

functional-programming - Ocaml:两个列表的等价

scala - Scala 中的并行文件处理

scala - Apache Spark - 是否可以使用依赖注入(inject)机制

scala - 作为参数传递的空参数函数

sockets - Akka 远程连接