Java 向发件人发送回信,并将其打印出来

Java 向发件人发送回信,并将其打印出来,java,akka,Java,Akka,我对阿克卡很陌生。我用它创建了一个简单的Hello World应用程序。 该应用程序非常简单,它会向我的简单演员发送一条消息。我想要的是将消息发送回消息的第一个发件人。我无法收到回信。有人怎么能这样做?客户端是否必须实现onReceive方法?我试图在代码中添加注释 import akka.actor.UntypedActor; public class HelloActor extends UntypedActor { @Override public

我对阿克卡很陌生。我用它创建了一个简单的Hello World应用程序。 该应用程序非常简单,它会向我的简单演员发送一条消息。我想要的是将消息发送回消息的第一个发件人。我无法收到回信。有人怎么能这样做?客户端是否必须实现onReceive方法?我试图在代码中添加注释

import akka.actor.UntypedActor;

    public class HelloActor extends UntypedActor {
        @Override
        public void onReceive(Object o) throws Exception {
            if(o instanceof String){
                String message = (String)o;
                System.out.println(message);
                // how to get this response ? 
                getSender().tell("World",getSelf());
            }
        }
    }
客户

import akka.actor.ActorRef;
    import akka.actor.ActorSystem;
    import akka.actor.Props;

    public class Client{

        public static void main(String[] args){
            ActorSystem actorSystem = ActorSystem.create("HelloWorldSystem");

            ActorRef listener = actorSystem.actorOf(new Props(HelloActor.class), "listener");
            // sending is OK but how to get the response?
            listener.tell("Hello");
        }

    }

正确的答案是使用未来:

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.dispatch.*;
import akka.dispatch.Future;
import akka.pattern.Patterns;
import akka.util.Duration;
import akka.util.Timeout;

public class Client{

    public static void main(String[] args){
        ActorSystem actorSystem = ActorSystem.create("HelloWorldSystem");
        ActorRef listener = actorSystem.actorOf(new Props(HelloActor.class), "listener");

        Timeout timeout = new Timeout(Duration.create(5, "seconds"));
        Future<Object> future = Patterns.ask(listener, "Hello", timeout);

        try{
            String result = (String) Await.result(future, timeout.duration());
            System.out.println(result);

        }catch (Exception e){
            e.printStackTrace();
        }

    }

}
导入akka.actor.ActorRef;
导入akka.actor.actor系统;
导入akka.actor.Props;
进口akka。发货。*;
进口akka.dispatch.Future;
导入akka.pattern.Patterns;
导入akka.util.Duration;
导入akka.util.Timeout;
公共类客户端{
公共静态void main(字符串[]args){
ActorSystem ActorSystem=ActorSystem.create(“HelloWorldSystem”);
ActorRef listener=actorSystem.actorOf(新道具(HelloActor.class),“listener”);
超时=新超时(持续时间.create(5,“秒”);
Future=Patterns.ask(侦听器,“Hello”,超时);
试一试{
字符串结果=(字符串)wait.result(future,timeout.duration());
系统输出打印项次(结果);
}捕获(例外e){
e、 printStackTrace();
}
}
}

您应该使用“询问”来获得
未来
,而不是在您的主要方法中使用“告知”。非常感谢。我只是用了一个未来,它成功了。我还不能用正确的实现来回答我的问题,但我会的。所以,在一个actor中运行的所有东西都主要在它自己的线程中?但不是一直如此?如果希望在参与者之间共享同一对象,会发生什么情况?actor by Essential确保其代码一次仅由一个线程处理。如果需要并行化,则需要一个由“路由器”管理的参与者池,以便在同一时间将同一对象分派给多个参与者。谢谢,我在翻阅关于阿克卡的书,大部分都太大了。我会大胆地买这个。再次感谢迈克!