typed Actor


如果我们有一个基于面向对象的应用程序,可以使用Typed Actor连接它与Akka system。

TypeActor允许定义多个方法,分别接受不同的消息。就像java中的接口。

注:Untyped Actor对消息进行回应,而Typed Actor 对方法进行回应。

什么是Typed Actor ?

Typed Actor包含两部分,接口和实现。

使用Typed Actor 尽量避免使用阻塞的方法,可以使用返回值为Unit或者Future的方法。

创建示例


默认构造函数

    CalculatorInt calculatorInt = TypedActor.get(system).typedActorOf(
            new TypedProps<CalculatorInt>(ICalculatorInt.class,CalculatorInt.class));

有参数的构造函数

    Squarer otherSquarer =
          TypedActor.get(system).typedActorOf(
            new TypedProps<SquarerImpl>(Squarer.class,
              new Creator<SquarerImpl>() {
                public SquarerImpl create() { return new SquarerImpl("foo"); }
              }),
            "name");

消息


强烈建议消息是不可变的。

发送消息

4.2

    // Invoke the method and wait for result
    Future<Integer> future = calculator.add(Integer.valueOf(14),
    Integer.valueOf(6));
    Integer result = Await.result(future, timeout.duration());

终止Actor


TypedActor.get(system).stop(calculator);

or

TypedActor.get(system).poisonPill(calculator);

生命周期


同unTyped Actor一样,有preStart,PostStop钩子方法,但是Typed Actor 是接口,要实现该接口,而不是重写。

接收任意消息


如果你的有类型actor的实现类扩展了akka.actor.TypedActor.Receiver,所有非方法调用MethodCall的消息会被传给onReceive方法. 这使你能够对DeathWatch的Terminated消息及其它类型的消息进行处理,例如,与无类型actor进行交互的场合。

代理


为了发送消息到Typed Actor ,你需要动态代理接口获得这个ActorRef.

注意

目标Actor引用需要能处理MethodCall消息.

    //Get access to the ActorRef
    ActorRef calActor = TypedActor.get(_system) .getActorRefFor(calculator);
    Chapter 4
    //pass a message
    calActor.tell("Hi there")s;

监控策略


当Typed Actor 处理子actor时,父Actor需要管理子actor的失败,因此需要定义监控策略。

通过实现类实现TypedActor.Supervisor方法,你可以定义用来监管子actor的策略。

Actor监控树


为了创建子actor,我们需要Typed Actor的context并执行axtorof方法。

ActorRef childActor = TypedActor.context().actorOf(
new Props(ChildActor.class), "childActor");

例子


有一个基于Typed Actor实现了加,减,计数的功能。

参阅:CalculatorTypedActor