我有很长的运行进程,假设 2 小时到 1 天。每个进程都以更新消息开始其生命周期,然后继续侦听进一步的并发更新。在更新消息中有一个唯一的目标标识符。
如果我想用Actor表示每个进程,如何初始化Actor?我显然需要根据更新消息中标识符的值执行原子查找/创建操作?如何使用 scala/akka 设计它?
设置一个执行这些进程参与者管理的单个参与者(例如ProcessManager
参与者)。 此执行组件将支持获取特定进程 ID 的进程执行组件的请求。 在内部,它将查看该孩子是否已经存在。 如果存在,它将使用该引用响应sender
。 如果没有,它将创建它,然后使用该 ref 响应sender
。 由于此管理器参与者按顺序处理其邮箱(与所有参与者一样),因此您不必担心查找/创建的争用条件。 一个非常简单的例子:
case class GetProcessHandler(processId:Int)
class ProcessManager extends Actor{
def receive = {
case GetProcessHandler(id) =>
val name = s"proc_$id"
val handler = context.child(name).getOrElse(
context.actorOf(Props[ProcessHandler], name)
)
sender ! handler
}
}
class ProcessHandler extends Actor{
def receive = {
...
}
}
application.conf
中指定起始演员。然后,您的main
程序可以使用您的Actor系统创建/初始化这些Actor。