假设你有一个actor,MyActor
,它依赖于一个无法序列化的对象。例子包括:
ObjectMapper
,操纵Json这样一个演员的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将失败。
如何在不使用静态全局状态的情况下解决此问题?
可以有不同类型的解决方案,这取决于您的需求。
你可以将服务包装在Cluster Singleton中,然后在整个集群中发送actor ref,你的actor props就会有这样的签名:public static Props props(ActorRef refToMapperWrapper, ActorRef refToServiceWrapper)
。
另一种解决方案是在您需要的节点上实例化新服务和对象映射器。然后,您应该在节点之间发送创建Service / ObjectMapper(即构造函数args)所需的对象,因此应以某种方式序列化这些对象。
最好在每个节点上独立创建ObjectMapper,但是它的配置可以通过节点发送。