【问题标题】:Akka dead letters encountered遇到的阿卡死信
【发布时间】:2015-04-08 13:11:16
【问题描述】:

我有MainActor,它在构造函数内部初始化了两个子SubActorASubActorB

SubActorA= this.getContext().actorOf(Props.create(SubActorA.class), "SubActorA");
SubActorB= this.getContext().actorOf(Props.create(SubActorB.class), "SubActorB");

public class SubActorA extends UntypedActor {

    @Override
    public void onReceive(Object o) throws Exception {
        Thread.sleep(3000);
        getSender().tell(new MessageResponseA().events + System.currentTimeMillis(), getSelf());
        getContext().stop(getSelf());
    }
}

public class SubActorB extends UntypedActor {

    @Override
    public void onReceive(Object o) throws Exception {
        Thread.sleep(3000);
        getSender().tell(new MessageResponseB().events + System.currentTimeMillis(), getSelf());
        getContext().stop(getSelf());
    }
}

MainActor 收到来自外部演员世界的Message 请求:

public Future<Iterable<Object>> start(){

    final ArrayList<Future<Object>> futures = new ArrayList<>();
    Timeout t = new Timeout(100, TimeUnit.MILLISECONDS);
    futures.add(ask(this.mainActor, new Message(customerCookie), t));
    final Future<Iterable<Object>> aggregate = Futures.sequence(futures,
            system.dispatcher());

    return aggregate;
}

一旦MainActor 收到Message,它就会将它发送给它的两个孩子SubActorASubActorB

    @Override
    public void onReceive(Object message) throws Exception {
        if(message instanceof `Message`){
            generalPersonalisationSender = getSender();
            SubActorA.tell(new MessageA(customerCookie), getSelf());
            SubActorB.tell(new MessageB(customerCookie), getSelf());
        }
        else if(message instanceof `MessageResponseA`){
            listener.tell(message, getSelf())
        }
        else if(message instanceof `MessageResponseB`){
            listener.tell(message, getSelf())
        }
}

因此,您可以看到已向每个子参与者发送了两条消息。但不幸的是,我只收到一条消息,并且还收到了关于DeadLetterINFO 通知。 Message was not delivered. [1] dead letters encountered.

您能帮我找出为什么我没有收到第二条消息吗?是否与关闭演员有关,但我只在Subactors内部的最低点停止它。

感谢您的帮助!

【问题讨论】:

  • 能把两个子演员的代码贴出来吗?另外,我假设您没有收到 B 消息,对吧?哪条消息被发送到 DeadLetters(从 main 到 a、main 到 b、a 到 main 或 b 到 main)?
  • @DiegoMartinoia,我添加了子演员。 DeadLetters 发生在从 MainActor 到我返回结果的任何其他 Actor 的路径上。
  • 我可以看到的一个直接潜在问题是,您(可能)没有将 MessageResponseX 从 A 或 B 发送到主要的:您正在发送 MessageResponseX.events+Long 。然而,根据 + 运算符处理您的事件,您可能正在发送 Long、String 或 Long/Object 的集合
  • @DiegoMartinoia,谢谢,这是正确的!我可以在聊天中再问你几个问题吗? chat.stackoverflow.com/rooms/74818/akka

标签: java akka


【解决方案1】:

看来您实际上并没有从 A 或 B 返回 MessageResponseX 到主要的:您正在发送 MessageResponseX.events+Long 。然而,根据 + 运算符处理您的事件,您可能正在发送 Long、String 或 Long/Object 的集合。

因此,您的 MainActor 接收方法不会拦截它,而是转到 DeadLetters。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多