演员回复非演员

Bil*_*Boy 6 java akka

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

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

那我该怎么做呢?

cmb*_*ter 13

这应该工作得很好.当你使用时ask,创建一个轻量级的actor(我相信用a表示PromiseActorRef)来表示发送者,这样就可以发回一个响应来完成通过Future它创建的响应ask.一个小例子来说明这一点.首先是测试演员:

class TestActor extends UntypedActor{
  public TestActor(){

  }

  public void onReceive(Object msg){
    getContext().sender().tell("bar", getContext().self());
  }
}
Run Code Online (Sandbox Code Playgroud)

然后是将调用它的非actor参与者

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);
  }
} 
Run Code Online (Sandbox Code Playgroud)

  • @BillyBadBoy,如果你仍然遇到这种方法的问题,请分享一个你正在做的事情的例子,我可以建议一个解决方案.当演员完成当前处理的消息时,发件人将被取消.一旦你在处理消息时遇到异步点,actor就会认为已完成处理该消息.在进入异步代码(`final ActorRef originator = getContext().sender();`)之后,你总是可以"捕获"发送者引用,然后再将`tell`反馈给那个引用. (3认同)