Akka DeadLetter监视器未接收到unhandled()发送的消息

时间:2018-11-29 14:12:58

标签: akka

我有以下演员设置:

#inv([F])[R]{c}=e[I]{c}
mat = scipy.linalg.inv(F) @ R
eigvals,eigvecs = scipy.linalg.eig(mat)
eigvals = 
array([[-5.06390561e+07+0.j],
   [ 5.06390548e+07+0.j],
   [ 2.91609260e-01+0.j]])

在启动时,会创建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(); } } actor,并向其发送Master消息,并且确实,我 do 看到以下日志输出:

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. 日志“ 收到一封死信!”,这告诉我我接线错误。有什么想法我要去哪里吗?

1 个答案:

答案 0 :(得分:1)

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消息显式调用Init方法,但是如果没有后备case子句,则调用unhandled would be called by default。还要注意,您可以通过配置log unhandled messages,而无需“监视”参与者:

akka {
  actor {
    debug {
      # enable DEBUG logging of unhandled messages
      unhandled = on
    }
  }
}
另一方面,

Dead letters是无法传递的消息,例如发送给已停止的actor的消息,它们还会触发publication of messages to the EventStream

由于未处理的消息与死信不同,因此您的DeadLetterWatcher的命名错误,可能应命名为UnhandledMessageWatcher。话虽如此,如果您的目标只是记录未处理的消息,那么最简单的方法就是使用上述记录配置。