我正在尝试创建一个具有两个参与者的简单应用程序:
- 处理某些应用操作的主 Actor
- DeadLettersListener 应该处理所有无效或未处理的消息
这是完美运行的代码:
object Hw extends App {
// creating Master actor
val masterActorSystem = ActorSystem("Master")
val master = masterActorSystem.actorOf(Props[Master], "Master")
// creating Dead Letters listener actor
val deadLettersActorSystem = ActorSystem.create("DeadLettersListener")
val listener = deadLettersActorSystem.actorOf(Props[DeadLettersListener])
// subscribe listener to Master's DeadLetters
masterActorSystem.eventStream.subscribe(listener, classOf[DeadLetter])
masterActorSystem.eventStream.subscribe(listener, classOf[UnhandledMessage])
}
根据 akka 手册,ActorSystem 是一个重对象,我们应该为每个应用程序只创建一个。但是当我替换这些行时:
val deadLettersActorSystem = ActorSystem.create("DeadLettersListener")
val listener = deadLettersActorSystem.actorOf(Props[DeadLettersListener])
使用此代码:
val listener = masterActorSystem.actorOf(Props[DeadLettersListener], "DeadLettersListener")
订阅不再起作用,并且 DeadLettersListener 没有收到任何 Dead 或 Unhandled 消息。
您能否解释一下我做错了什么,并提供在这种情况下如何订阅死信的建议?
最佳答案
我真的无法想象你做错了什么,我创建了一个小例子,它似乎有效:
object Hw extends App {
class Master extends Actor {
override def receive: Receive = {
case a => println(s"$a received in $self")
}
}
class DeadLettersListener extends Actor {
override def receive: Actor.Receive = {
case a => println(s"$a received in $self")
}
}
// creating Master actor
val masterActorSystem = ActorSystem("Master")
val master = masterActorSystem.actorOf(Props[Master], "Master")
val listener = masterActorSystem.actorOf(Props[DeadLettersListener])
// subscribe listener to Master's DeadLetters
masterActorSystem.eventStream.subscribe(listener, classOf[DeadLetter])
masterActorSystem.eventStream.subscribe(listener, classOf[UnhandledMessage])
masterActorSystem.actorSelection("/unexistingActor") ! "yo"
}
你能尝试一下吗?
关于scala - 在 Akka 中为多个 Actor 订阅 Dead Letters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29767903/