代码之家  ›  专栏  ›  技术社区  ›  hotmeatballsoup

AKKA死信监视器未接收未处理()发送的消息

  •  0
  • hotmeatballsoup  · 技术社区  · 6 年前

    我有以下演员设置:

    public class Master extends AbstractActor {
      protected Logger log = LoggerFactory.getLogger(this.getClass());
    
      @Override
      public Receive createReceive() {
        return receiveBuilder()
            .match(Init.class, init -> {
              log.info("Master received an Init, creating DLW and subscribing it.");
              ActorRef deadLetterWatcher = context().actorOf(Props.create(DeadLetterWatcher.class),
                "DLW");
    
              context().system().eventStream().subscribe(deadLetterWatcher, DeadLetterWatcher.class);
              log.info("Master finished initializing.");
            })
            .matchAny(message -> {
              log.info("Found a {} that Master can't handle.",
                  message.getClass().getName());
              unhandled(message);
            }).build();
      }
    }
    
    public class DeadLetterWatcher extends AbstractActor {
      protected Logger log = LoggerFactory.getLogger(this.getClass());
    
      @Override
      public Receive createReceive() {
        return receiveBuilder()
          .matchAny(message -> {
            log.info("Got a dead letter!")
          }).build();
      }
    }
    

    在启动时 Master 参与者被创建并被发送到 Init 信息,当然,我 请参阅以下日志输出:

    Master received an Init, creating DLW and subscribing it.
    Master finished initializing.
    

    但不久之后, 主人 被发送A Fizzbuzz 消息,我在日志中看到:

    Found a com.me.myapp.Fizzbuzz that Master can't handle.
    

    但是我 不要 DeadLetterWatcher 原木 收到一封死信! “,这说明我有错误的连线。知道我要去哪里吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jeffrey Chung    6 年前

    传球 akka.actor.UnhandledMessage.class 而不是 DeadLetterWatcher.class ,到 subscribe() 方法:

    context().system().eventStream().subscribe(deadLetterWatcher, akka.actor.UnhandledMessage.class);
    

    注意 unhandled messages 与死信不同。对于前者,参与者“必须为它可以接受的所有消息提供一个模式匹配,如果您希望能够处理未知消息,那么您需要有一个默认情况。”您的 Master 仅参与者处理 Init 消息;它接收的所有其他消息都被视为“未处理”,并触发 akka.actor.UnhandledMessage EventStream .你明确地说 unhandled 非方法 初始化 消息,但是 unhandled would be called by default 如果你没有退路 case 条款。还要注意,你可以 log unhandled messages 通过配置,无需“监视器”参与者:

    akka {
      actor {
        debug {
          # enable DEBUG logging of unhandled messages
          unhandled = on
        }
      }
    }
    

    Dead letters 另一方面,是无法传递的消息,例如发送到已停止的参与者的消息,它们还触发 publication of messages to the EventStream .

    由于未处理的消息与死信不同,因此 DeadLetterWatcher 名字有误,应该是 UnhandledMessageWatcher . 也就是说,如果您的目标只是记录未处理的消息,那么最简单的方法是使用上面提到的日志配置来完成这一操作。