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