scala - 在 Akka 中为多个 Actor 订阅 Dead Letters

标签 scala functional-programming akka

我正在尝试创建一个具有两个参与者的简单应用程序:

  • 处理某些应用操作的主 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/

相关文章:

erlang - Erlang 中的列表右旋转

eclipse - Spark 应用程序在 Eclipse 中使用 Scala 和 SBT

scala - 有条件地过滤一个序列

scala - mutable.SynchronizedQueue 上的 dequeueAll 是线程安全的吗?

functional-programming - 如何创建没有样板代码的只读结构?

scala - 进程间通信的静态类型参与者模型有什么不可行的地方吗?

scala - 如何理解 "println"和 `for`中的 `yield`语句

scala - 环境 monad 中术语环境的含义

akka - 我怎样才能每 5 分钟执行一次 Akka actor?

scala - Akka Http Server - 如何让路由响应字节数组二进制响应