Монитор Akka DeadLetter не получает сообщения, отправленные необработанными () - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующие настройки актера:

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.

Однако вскоре после этого Master отправляется сообщение Fizzbuzz, и я вижу это в журналах:

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

Но тогда я не см. DeadLetterWatcher журнал " Получил мертвую букву! ", которая говорит мне, что у меня что-то неправильно подключено.Любые идеи, где я иду не так, как надо?

1 Ответ

0 голосов
/ 01 декабря 2018

Передайте akka.actor.UnhandledMessage.class вместо DeadLetterWatcher.class методу subscribe():

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

Обратите внимание, что необработанные сообщения - это не то же самое, что мертвые буквы.В первом случае актер «должен предоставить сопоставление с образцом для всех сообщений, которые он может принять, и если вы хотите обрабатывать неизвестные сообщения, вам необходимо иметь регистр по умолчанию».Ваш Master актер обрабатывает только Init сообщений;все остальные полученные сообщения считаются «необработанными» и инициируют публикацию akka.actor.UnhandledMessage в EventStream.Вы явно вызываете метод unhandled для сообщений, не являющихся Init, но unhandled будет вызываться по умолчанию , если у вас нет запасного предложения case.Также обратите внимание, что вы можете регистрировать необработанные сообщения через конфигурацию, без необходимости «субъекта-монитора»:

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

Мертвые буквы , с другой стороныявляются сообщениями, которые не могут быть доставлены, например сообщениями, отправленными остановленному субъекту, и они также инициируют публикацию сообщений в EventStream.

, поскольку необработанные сообщения отличаютсяиз мертвых букв ваш DeadLetterWatcher назван неправильно и, вероятно, должен быть назван примерно как UnhandledMessageWatcher.При этом, если ваша цель состоит только в том, чтобы регистрировать необработанные сообщения, то самый простой подход - сделать это с конфигурацией регистрации, упомянутой выше.

...