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