【问题标题】:Subscribing multiple actors to Dead Letters in Akka在 Akka 中为多个演员订阅死信
【发布时间】:2015-04-21 09:18:05
【问题描述】:

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

  • 处理一些应用操作的主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 消息。

您能否解释一下我做错了什么,并给出在这种情况下如何订阅 Dead Letters 的建议?

【问题讨论】:

    标签: scala functional-programming akka


    【解决方案1】:

    我真的无法想象你做错了什么,我创建了一个小例子,它似乎工作:

    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"
    }
    

    你可以试试吗?

    【讨论】:

    • 非常感谢!您的回答帮助我缩小范围并确定问题是我有其他代码最终执行masterActorSystem.shutdown() 我认为这会杀死主演员,但显然它正在杀死所有流演员,包括 DeadLettersListener。
    猜你喜欢
    • 2014-06-13
    • 2017-09-09
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2013-09-21
    • 2014-12-02
    • 1970-01-01
    相关资源
    最近更新 更多