2017-01-21 10 views
2

今、私は少し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(); 
      } 
     } 
    }; 
} 

答えて

2

それは単にあなたが現在を処理しているメッセージを送った俳優の参照(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()メソッドは静的で、アクターシステムの外部で完全に実行されます。それは別のクラスに入る可能性があります。

ここでgetSender()は意味がありません。「akka」送信者はありません。

+0

私はメソッドgetSender()の戻り値を理解しています。しかし、私はまだいくつかの点と混同していない、可能であれば私の追加の質問を参照してください。 –

+0

クラスが2つの懸念を混ぜているので混乱しています:* websocketイベントハンドリング* *アクターメッセージ処理* さらに、joinメソッドのask()は動作しません。なぜなら、ask()はakkaアクターによって呼び出されるのではなく、静的メソッドによって呼び出されるからです。 したがって、メッセージの起源がアクターではないため、getSender()はアクター参照を返しません。私は何を意味するか見ていますか? –

+0

膨大な量の情報があります。まず、_websocketイベント処理とアクターメッセージ処理の意味は?あなたはもっと具体的になりますか?第二に、私はあなたが言うことを理解することができます。つまり、Akkaの理論に従わないことです。実際、このコードをどうすればいいですか?あなたは何か考えていますか? –

関連する問題