現在我正在學習Akka,但我無法理解getSender()
的確切含義。 在this official document,方法getSender()
的使用量和解釋是一樣'getSender()`在Akka中意味着什麼?
// Reply to original sender of message 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;
}
}
}
}
在上面的代碼中,在onReceive(Object message)
方法可以看到getSender()
方法。但是,當調用join(final String username, WebSocket.In<JsonNode> in, WebSocket.Out out)
方法時,首先演員詢問另一個演員的新消息,然後在onReceive(Object message)
方法中,另一個演員通過執行如getSender().tell(true, ref);
執行true
來回答。在這種情況下,getSender()
給出了第一個詢問的演員。是不是很奇怪,因爲第一個演員要求true
給另一個演員誰應該給第一個演員true
? 你的回答會非常有用,但我仍然不清楚,對不起。
編輯: 你說這不起作用,但它的工作原理。 您是否熟悉PlayFramework?如果是這樣,那麼把握整個畫面是完全簡單的。該代碼是調用join()
方法的控制器代碼。
public static WebSocket<JsonNode> ws() {
final String username = session("username");
return new WebSocket<JsonNode>() {
@Override
public void onReady(final WebSocket.In<JsonNode> in, final WebSocket.Out<JsonNode> out) {
try {
WebSocketActor.join(username, in, out);
} catch (Exception e) {
Logger.error("Can't connect WebSocket");
e.printStackTrace();
}
}
};
}
我明白getSender()方法的返回值。但是,我仍然沒有把一些觀點混淆,如果可能的話,請看我的附加問題。 –
好的,你感到困惑,因爲你的類混合了兩個問題:* websocket事件處理*與* actor消息處理*。 此外,join方法中的ask()將不起作用 - 因爲ask()不是由akka actor調用的,而是靜態方法! 因此,getSender()不會返回actor參考,因爲消息的來源不是actor。你明白我的意思嗎? –
有大量的信息,讓我看看......首先,你是什麼意思_websocket事件處理與演員消息handling_?你可以說得更詳細點嗎?其次,我可以理解你說的話,也就是說它不好,不遵循阿卡的理論。實際上,我應該如何解釋這些代碼呢?你有什麼主意嗎? –