Java 什么是';getSender()`在阿克卡是什么意思?

Java 什么是';getSender()`在阿克卡是什么意思?,java,akka,actor,Java,Akka,Actor,现在我学习了一点Akka,但我不明白getSender()的确切含义。 方法中使用了getSender(),解释如下 //回复邮件的原始发件人 getSender().tell(msg+“:“+getSelf()) 这似乎是一个响应方法,所以这个参与者必须响应一个发送消息的参与者,而这个方法实际上就是这样做的。我很困惑,因为我不明白getSender()提供的是接收者角色还是发送者角色。那么,你能给我解释一下吗 谢谢 public class WebSocketActor extends Unt

现在我学习了一点Akka,但我不明白
getSender()
的确切含义。 方法中使用了
getSender()
,解释如下

//回复邮件的原始发件人
getSender().tell(msg+“:“+getSelf())

这似乎是一个响应方法,所以这个参与者必须响应一个发送消息的参与者,而这个方法实际上就是这样做的。我很困惑,因为我不明白
getSender()
提供的是接收者角色还是发送者角色。那么,你能给我解释一下吗

谢谢

public class WebSocketActor extends UntypedActor {

/**
 * Actor's reference
 */
private final static ActorRef ref = Akka.system().actorOf(new Props(WebSocketActor.class));

/**
 * the list of those who should get messages
 */
Map<String, WebSocket.Out<JsonNode>> members = new HashMap<String, WebSocket.Out<JsonNode>>();

/**
 * a method adding a certain user
 * @param username a user name
 * @param in receive of WebSokcet
 * @param out sending of WebSocket
 * @throws Exception
 */
public static void join(final String username, WebSocket.In<JsonNode> in, WebSocket.Out<JsonNode> out) throws Exception {

    // causing JOIN event 
    Boolean result = (Boolean) Await.result(ask(ref, new Message(username, "", "", WebSocketEvent.JOIN, out), 1000), Duration.create(1, SECONDS));

    if(result) {
        // if a message is sent,MESSAGE event will occur.
        in.onMessage(new Callback<JsonNode>() {
            public void invoke(JsonNode event) {
                ref.tell(new Message(username, event.get("x").asText(), event.get("y").asText(), WebSocketEvent.MESSAGE, null), ref);
            }
        });
        // a close method when WebSocket is closed
        in.onClose(new Callback0() {
            public void invoke() {
                ref.tell(new Message(username, "", "", WebSocketEvent.QUIT, null), ref);
            }
        });
    } else {
        // sending an error
        ObjectNode error = Json.newObject();
        error.put("error", result);
        out.write(error);
    }
}

/**
 * the executable method when an event happens
 * @param message an event object
 * @throws Exception
 */
@Override
public void onReceive(Object message) throws Exception {

    // diciding whether the object is an event or not
    Option<Message> event = EventUtil.getEvent(message);
    if(event.isDefined()){
        Message m = event.get();
        switch (m.getEventType()) {
            // adding to members
            case JOIN:
                members.put(m.getUsername(), m.getChannel());
                getSender().tell(true, ref);
                break;
            // sending all
            case MESSAGE:
                WebSocketMessenger.notifyAll(m.getUsername(), m.getX(), m.getY(), members);
                break;
            // excluding someone from members
            case QUIT:
                members.remove(m.getUsername());
                break;
            default:
                unhandled(message);
                break;
        }
    }

}

它只返回对刚刚发送您当前正在处理的消息的参与者(
ActorRef
)的引用

因此,这是演员回答信息的一种方式。。。在处理它的代码中

换句话说,如果参与者A向参与者B发送消息M1,当B调用
getSender
时,它将返回参与者A上的引用

在提供代码后编辑:

以下操作无法正常工作:

Boolean result = (Boolean) Await.result(ask(ref, new Message(username, "", "", WebSocketEvent.JOIN, out), 1000), Duration.create(1, SECONDS));
如果你自己不是演员,你就不能要求演员回答。
join()
方法是静态的,完全在actor系统之外执行!它可以(也应该)在另一个班级


这就是为什么
getSender()
在这里没有意义:没有“akka”发送者。

我理解方法
getSender()
的返回值。但是,我仍然没有对一些问题感到困惑,如果可能的话,请查看我的附加问题。好吧,您感到困惑是因为您的类混淆了两个问题:websocket事件处理和actor消息处理。此外,join方法中的ask()不起作用-因为ask()不是由akka参与者调用的,而是一个静态方法!因此,getSender()不会返回actor引用,因为消息的来源不是actor。你明白我的意思吗?有大量的信息,让我看看。。。首先,您所说的websocket事件处理和参与者消息处理是什么意思?你能说得更具体些吗?第二,我可能能理解你说的,也就是说它不好,没有遵循阿克卡的理论。事实上,我应该如何解释这段代码?你知道吗?
Boolean result = (Boolean) Await.result(ask(ref, new Message(username, "", "", WebSocketEvent.JOIN, out), 1000), Duration.create(1, SECONDS));