如何创建对远程节点具有不可序列化依赖关系的Actor?

时间:2018-08-29 18:59:18

标签: akka akka-cluster

假设您有一个Actor MyActor,它依赖于无法序列化的对象。示例包括:

  • Jackson ObjectMapper,用于操纵Json
  • 从DI容器获得的某种服务

在Java中,这样一个演员的Props可能看起来像这样:

public static Props props(ObjectMapper m, SomeService s) {
    return Props.create(new Creator<MyActor>() {
        @Override
        public MyActor create() throws Exception {
            return new MyActor(m, s);
        }
    });
}

依赖关系传递到Actor的构造函数中。问题是,这在集群环境中将不起作用:这些对象不可序列化,因此尝试在远程节点上创建actor将会失败。

我们如何不用使用静态全局状态来解决此问题?

1 个答案:

答案 0 :(得分:0)

解决方案可以有不同类型,具体取决于您的需求。

您可以将服务包装在例如Cluster Singleton中,然后将actor ref发送到整个Cluster中,然后您的actor道具将具有以下签名: public static Props props(ActorRef refToMapperWrapper, ActorRef refToServiceWrapper)

另一个解决方案是在您需要的节点上实例化新服务和对象映射器。然后,您应该在节点之间发送创建Service / ObjectMapper所需的对象(即构造函数args),因此应以某种方式对这些对象进行序列化。

最好在每个节点上单独创建ObjectMapper,但是可以在节点之间发送其配置。