我无法从子actor向其父级发送消息。 我正在使用Java 8& Akka 2.5.1
主要父级是在impl类中创建的:
ActorSystem system = ActorSystem.create("My-Akka");
ActorRef master = system.actorOf(Props.create(Master.class));
master.tell(new Object_B_Message(), ActorRef.noSender());
master类具有以下接收实现:
public Receive createReceive() {
return receiveBuilder()
.match(Object_B_Message.class, message -> {
ActorRef objectB= context().actorOf(Props.create(ObjectB.class));
objectB.tell(message, this.getSelf());
})
.match(Object_C_message.class, message -> {
ActorRef objectC = context().actorOf(Props.create(ObjectC.class));
objectC.tell(message, this.getSelf());
})
我现在希望ObjectB通过向主服务器发送object_C_message来接受消息,执行某些操作并激活ObjectC。
我能够激活对象B,但是当它尝试发送object_c_message时,它似乎无处可去,主人没有收到它。
以下是ObjectB中的代码:
public Receive createReceive() {
return receiveBuilder()
.match(Object_B_message.class, message -> {
以下所有代码行都没有能够将消息发送给主服务器:
ActorRef ref = getContext().parent();
this.getSelf().tell(object_c_message, this.getSelf());
ref.tell(object_c_message, getSender());
ref.tell(object_c_message, ActorRef.noSender());
ref.tell(object_c_message, this.getSender());
ref.tell(object_c_message, ref);
ref.tell(object_c_message, context().parent());
ref.tell(object_c_message, this.getSelf());
Akka在终止应用程序之前将以下消息打印到控制台10次:
[akka://My-Akka/user/$a/$f] Message [object_c_message] from Actor[akka://My-Akka/user/$a/$f#-489049040] to Actor[akka://My-Akka/user/$a/$f#-489049040] was not delivered. [1] dead letters encountered. This logging can be turned off...'.
BTW - 只是为了确保代码正确连接我能够直接使用object_C_message调用主服务器,并且主服务器获得了消息并激活了对象C.
感谢您的帮助。
答案 0 :(得分:0)
让我们来看看你的台词。
首先,您没有展示如何创建object_c_message
。我认为你做的是正确的事。
ActorRef ref = getContext().parent();
到目前为止,这么好。虽然,您可以只使用getSender()
。
this.getSelf().tell(object_c_message, this.getSelf());
这是错的。您正在向自己发送消息。
ref.tell(object_c_message, getSender());
这是错误的。您将代表当前发件人(也是您的父母)将邮件发送给父。
ref.tell(object_c_message, ActorRef.noSender());
再次,一半错了。它会将其发送给您的父母,但父母将无法回复。
ref.tell(object_c_message, this.getSender());
这与1重复。
ref.tell(object_c_message, ref);
这相当于4.因为在这种情况下ref == getSender()。
ref.tell(object_c_message, context().parent());
这相当于2.因为在这种情况下ref == getSender()。
ref.tell(object_c_message, this.getSelf());
我们明白了!这是你可以使用的正确的。或者,getSendert().tell(object_c_message, getSelf());
也会这样做。
那么为什么它不起作用?谁知道。尝试添加更多日志语句,在检查getSender()和getSelf()和ref的值时调试ide。也许你没有创建正确的对象,而是在主人的接收中转到未处理/死信。
你可以做的另一件事是,在创建时命名你的演员,所以你的日志会说出演员发送/接收的电子邮件消息,而不是akka生成的可理解名称(context.actorOf(DemoActor.props(42), "name");
执行这些操作,并使用名称发布更新的日志。我们将能够为您提供更多帮助。