Akka的父母没有收到孩子的消息

时间:2017-05-11 15:54:55

标签: java akka

我无法从子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.

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

让我们来看看你的台词。

首先,您没有展示如何创建object_c_message。我认为你做的是正确的事。

ActorRef ref = getContext().parent();

到目前为止,这么好。虽然,您可以只使用getSender()

  1. this.getSelf().tell(object_c_message, this.getSelf()); 这是错的。您正在向自己发送消息。

  2. ref.tell(object_c_message, getSender());这是错误的。您将代表当前发件人(也是您的父母)将邮件发送给父

  3. ref.tell(object_c_message, ActorRef.noSender());再次,一半错了。它会将其发送给您的父母,但父母将无法回复。

  4. ref.tell(object_c_message, this.getSender());这与1重复。

  5. ref.tell(object_c_message, ref);这相当于4.因为在这种情况下ref == getSender()。

  6. ref.tell(object_c_message, context().parent());这相当于2.因为在这种情况下ref == getSender()。

  7. ref.tell(object_c_message, this.getSelf());我们明白了!这是你可以使用的正确的。或者,getSendert().tell(object_c_message, getSelf());也会这样做。

  8. 那么为什么它不起作用?谁知道。尝试添加更多日志语句,在检查getSender()和getSelf()和ref的值时调试ide。也许你没有创建正确的对象,而是在主人的接收中转到未处理/死信。

    你可以做的另一件事是,在创建时命名你的演员,所以你的日志会说出演员发送/接收的电子邮件消息,而不是akka生成的可理解名称(context.actorOf(DemoActor.props(42), "name");

    执行这些操作,并使用名称发布更新的日志。我们将能够为您提供更多帮助。