我正在寻找使用guice提供的一些对象来引导akka actor系统,并且我不确定如何在不使用icky静态提供程序的情况下执行此操作。
具体来说,我已经配置了xstream来支持@Inject注释,这样当你反序列化文档时,程序员可以在表单中添加一个字段
private @Inject transient SomeServiceObject someServiceObject;
这并没有经常使用,但在使用它的真正方便的地方。
这允许我们编写像
这样的模型对象public class ComplexModelObject{
private List<List<Double>> matrix; //my domain has a lot of these.
//keeps stateful references to things like native fortran libraries (gasp! fortran!!)
//and other problematic-to-serialize state
//--can be constructed easily by guice though.
private transient @Inject ComplexMathyThing mathy;
public int getRank(){ return matrix.size(); }
public double getOtherObviousThing(){ return doObviousTransform(matrix); }
public double getRSigmaMachinaValue(){ mathy.doComplexTransform(matrix); }
}
问题在于将其变成akka actor模型。我想提供akka这样的序列化程序,问题是序列化程序实例 - 出于显而易见的原因 - 依赖于一个注入器实例,如下所示:
public class AKKAXStreamXMLSerializer extends akka.serialization.JSerializer {
private final XStream serializer;
public AKKAXStreamXMLSerializer(Injector injector){
this.serializer = OurSerializerFactory.buildConfiguredSerializerWith(injector);
}
@Override public Object fromBinaryJava(byte[] bytes, Class<?> manifest) {
return serializer.fromXML(new ByteArrayInputStream(bytes));
}
@Override public int identifier() {
return 872391;
}
@Override public byte[] toBinary(Object o) {
return serializer.toXML(o).getBytes();
}
@Override public boolean includeManifest() {
return false;
}
}
这意味着我不能简单地在conf文件中给akka一个typename,因为它不知道如何解决该构造函数参数。
查看akkas serialization documentation,他们没有提到以编程方式设置序列化程序,他们只提到通过conf文件配置它。看一下akka源代码,我找不到任何对序列化器对象的引用或者它们是如何被解析的,所以它看起来像是我的SOL。
我是否缺少一些明显的API?我是使用静态提供程序找到所有这些内容的最佳策略吗?
编辑:我发现了两个有趣的前景:有关于如何使用激活器的guice的演示。这个演示的问题在于它似乎对如何让guice为你创建演员感兴趣。这不是我的问题,但对于阅读此内容的任何人来说,you can take a look
有一个名为dyanmic access的类,配置文件解析代码用它来生成它的类。它有几种让它看起来像akka的 objenesis 的方法(因为缺少一个更好的术语,它是通用工厂)。它的记录就像是一个用户扩展点,但只有非常复杂的用户应该使用它。
非常感谢akka专家的想法