akka,IOC(DI,guice)和xstream

时间:2015-09-14 08:11:36

标签: java scala akka guice xstream

我正在寻找使用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专家的想法

0 个答案:

没有答案