我正在寻找使用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我不见了?我是使用静态提供程序找到所有这些东西的最佳策略吗?


编辑:我发现了两个有趣的前景:

  • 那里有一个问题,但对于任何阅读此内容的人来说,you can take a look

  • 有一个名为dyanmic access的类,配置文件解析代码用它来生成它的类 . 它是一个观察对象(因为缺乏一个更好的术语,它是通用工厂) . 它的记录就像是一个用户扩展点,但只有非常复杂的用户应该使用它 .

非常感谢akka专家的想法