今、私は少しAkkaを学んでいますが、私はgetSender()
の正確な意味を理解できません。方法getSender()
this official document,で が使用され、説明がAkkaの 'getSender()'は何を意味しますか?
// 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)
メソッドでは、別のアクタがのように実行して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()の戻り値を理解しています。しかし、私はまだいくつかの点と混同していない、可能であれば私の追加の質問を参照してください。 –
クラスが2つの懸念を混ぜているので混乱しています:* websocketイベントハンドリング* *アクターメッセージ処理* さらに、joinメソッドのask()は動作しません。なぜなら、ask()はakkaアクターによって呼び出されるのではなく、静的メソッドによって呼び出されるからです。 したがって、メッセージの起源がアクターではないため、getSender()はアクター参照を返しません。私は何を意味するか見ていますか? –
膨大な量の情報があります。まず、_websocketイベント処理とアクターメッセージ処理の意味は?あなたはもっと具体的になりますか?第二に、私はあなたが言うことを理解することができます。つまり、Akkaの理論に従わないことです。実際、このコードをどうすればいいですか?あなたは何か考えていますか? –