2014-11-06 32 views
0
class MyActor(val service1: MyService1, val service2: MyService2) extends Actor { 
    ... 
} 

我打算通过akka集群扩展在集群中的路由器后面使用我的actor。一些父母演员将创建这些演员的“池”。 所以,这个“池”的建立将类似于:演员的状态是否必须是可序列化的?

context.actorOf(Props(classOf[MyActor], service1, service2), "myActor") 

,并在部署一节的配置文件中我将指定该演员路由器的选择。

但我想这是为了让它工作MyService1和MyService2必须是可序列化的,不是吗? 也许这个要求并不直接关系到演员,而是关于它的道具?

回答

1

如果您尝试过使用集群分片扩展(它建立在集群顶部),那么您意识到,当您创建远程演员时,您会丧失控制的程度他们的创作。所以,一般来说,如果你需要道具,你需要它们是可序列化的。

如果你想看看你的角色/道具/消息是序列化,你可以在阿卡的配置去实现这两个标志(更多信息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) 
    } 
} 

需要注意的是,在这种情况下,除非您是通过事件采购或快照坚持你的角色,你需要重新发送init消息在启动时(当它死亡并重新开始或当它移动到另一台机器时)。但通常你会使用持久性,这不是什么大问题。您还可以在您的actor中添加一个消息队列,以在获得初始消息之前保存接收到的所有“操作”消息,然后在您收到初始消息后提供它们。

+1

我知道这有点晚,但为了避免使用Option [T]服务,您可以使用状态机行为http://doc.akka.io/docs/akka/snapshot/scala/actors.html在接收到初始化消息后,#变得不可能将您的服务在状态中传递。 – vicaba 2015-10-16 18:26:21

相关问题