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");
消息
强烈建议消息是不可变的。
发送消息
// 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