我有以下演员设置:
#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.
日志“ 收到一封死信!”,这告诉我我接线错误。有什么想法我要去哪里吗?
答案 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
。话虽如此,如果您的目标只是记录未处理的消息,那么最简单的方法就是使用上述记录配置。