2017-01-21 63 views
2

現在我正在學習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(); 
      } 
     } 
    }; 
} 

回答

2

它只是簡單地返回(ActorRef,只是發送您當前正在處理消息對演員的參考。

因此,這是一個演員在處理它的代碼中給回答的方法...。

換句話說,如果男演員發送消息M1到演員B,當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」發件人。

+0

我明白getSender()方法的返回值。但是,我仍然沒有把一些觀點混淆,如果可能的話,請看我的附加問題。 –

+0

好的,你感到困惑,因爲你的類混合了兩個問題:* websocket事件處理*與* actor消息處理*。 此外,join方法中的ask()將不起作用 - 因爲ask()不是由akka actor調用的,而是靜態方法! 因此,getSender()不會返回actor參考,因爲消息的來源不是actor。你明白我的意思嗎? –

+0

有大量的信息,讓我看看......首先,你是什麼意思_websocket事件處理與演員消息handling_?你可以說得更詳細點嗎?其次,我可以理解你說的話,也就是說它不好,不遵循阿卡的理論。實際上,我應該如何解釋這些代碼呢?你有什麼主意嗎? –