【发布时间】:2020-03-20 04:32:40
【问题描述】:
我一直在尝试使用函数式方法来实现持久性参与者——我的意思是根本没有变量。但是我遇到了麻烦 :) 下面的代码示例不能正常工作,因为处理程序参数在处理程序之间不共享(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))
}
}
}
【问题讨论】:
-
不太清楚你的问题是什么。请提出一个特定的问题,指出一个特定的问题,该问题可以被没有你的整个代码库的其他人复制。
-
我的问题很简单,如何在不使用变量(保持其状态)的情况下实现持久化actor
-
所以actor是无国籍的?让你的演员无国籍有什么问题?
-
不,不是。我想将其状态实现为函数
-
演员的状态是否由您在其中的
handle函数表示?
标签: scala functional-programming akka actor