class MyActor(val service1: MyService1, val service2: MyService2) extends Actor {
...
}
我打算通过akka-cluster扩展在集群中的路由器后面使用我的演员。一些家长将创建" pool"这些演员 所以,创建这个" pool"看起来类似于:
context.actorOf(Props(classOf[MyActor], service1, service2), "myActor")
并在部署部分的配置文件中,我将指定此actor的路由器选项。
但我觉得为了让它工作MyService1和MyService2必须是可序列化的,不是吗? 也许这个要求不是直接与演员有关,而是与其道具有关?
答案 0 :(得分:1)
如果您尝试使用群集分片扩展(构建在群集顶部)稍微玩一下,您会意识到,当您创建远程角色时,您有点丧失了控制他们的程度创建。所以,一般来说,如果你想要道具,你需要它们可以序列化。
如果你想看看你的演员/道具/消息是否可序列化,你可以进入akka的配置并启用这两个标志(更多信息here):
akka {
actor {
serialize-messages = on
serialize-creators = on
}
}
我宁愿向你建议一个不同的方法,即使你必须使用集群分片(你不能在actor构造函数中有参数),它也会工作:通过消息初始化。
你的演员会变得像:
class MyActor extends Actor {
var service1: Option[MyService1] = None
var service2: Option[MyService2] = None
override def receive = {
case Init(s1, s2) => service1 = Some(s1); service2 = Some(s2)
}
}
请注意,在这种情况下,除非您通过事件源或快照保持您的actor,否则您需要在actor的启动时重新发送init消息(当它死亡并再次启动时或者当它被移动到另一台机器)。但通常你会使用持久性,这不是什么大问题。您还可以在actor中添加消息队列,以便在收到init消息之前保留所有收到的“操作”消息,然后在收到init消息后提供它们。