如何创建在远程节点上具有不可序列化依赖项的Actor?

问题描述 投票:0回答:1

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

  • 杰克逊ObjectMapper,操纵Json
  • 从DI容器中获得的某种服务

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

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将失败。

如何在不使用静态全局状态的情况下解决此问题?

akka akka-cluster
1个回答
0
投票

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

你可以将服务包装在Cluster Singleton中,然后在整个集群中发送actor ref,你的actor props就会有这样的签名:public static Props props(ActorRef refToMapperWrapper, ActorRef refToServiceWrapper)

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

最好在每个节点上独立创建ObjectMapper,但是它的配置可以通过节点发送。

© www.soinside.com 2019 - 2024. All rights reserved.