演员回复非演员

时间:2013-08-14 10:08:47

标签: java akka

我刚刚开始使用AKKA并且有一个关于非演员代码如何与演员代码对话的基本问题。

非演员代码如何调用actor并获得响应?我尝试使用Patterns.ask从非演员调用演员,但这不起作用,因为没有演员可以响应的'发送者'。

那我该怎么办呢?

1 个答案:

答案 0 :(得分:13)

这应该可以正常工作。当您使用ask时,会创建一个轻量级的actor(我相信由PromiseActorRef表示)来表示发件人,以便可以发回一个响应来完成创建的Future通过ask。一个小例子来说明这一点。首先是测试演员:

class TestActor extends UntypedActor{
  public TestActor(){

  }

  public void onReceive(Object msg){
    getContext().sender().tell("bar", getContext().self());
  }
}

然后将调用它的非演员代码

import java.util.concurrent.TimeUnit;
import scala.concurrent.Await;
import scala.concurrent.Future;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.pattern.Patterns;
import akka.util.Timeout;

public class AskTest {

  public static void main(String[] args) throws Exception{
    ActorSystem sys = ActorSystem.apply("test");
    ActorRef ref = sys.actorOf(Props.create(TestActor.class), "mytest");        
    Timeout t = new Timeout(5, TimeUnit.SECONDS);
    Future<Object> fut = Patterns.ask(ref, "foo", t);
    String response = (String)Await.result(fut, t.duration());
    System.out.println(response);
  }
}