如何使用Behavior.receiveMessage处理生命周期信号

时间:2019-07-01 06:53:30

标签: scala akka akka-typed

我有一个演员,其创建方式如下:

    Behaviors.setup { context =>
          val greeter = context.spawn(HelloWorld.greeter, "greeter")

          Behaviors.receiveMessage { message =>
            val replyTo = context.spawn(HelloWorldBot.bot(greetingCounter = 0, max = 3), message.name)
            greeter ! HelloWorld.Greet(message.name, replyTo)
            Behaviors.same
          }
        }

我想处理Behaviors.receiveMessage中的 Signals 消息(例如PostStop),并且文档中说:

  

只有一个参数的Receive的简化版本-   要处理的消息。当上下文已经存在时很有用   可以通过其他方式访问,例如包裹在设备或类似设备中。   构造一个可以对两个传入消息都做出反应的参与者行为   和生命周期信号。从另一个演员派生这个演员之后   (或作为akka.actor.typed.ActorSystem的监护人)   在允许访问系统的ActorContext中执行,   产生并观看其他演员等。与使用   摘要此工厂的行为是一种更具功能性的定义   行为。处理下一条消息会导致新的行为   可能与此不同。状态保持   通过返回具有新的不可变状态的新行为。

但是如何在Behaviors.receiveMessage内实现生命周期信号?

以下是文档https://doc.akka.io/api/akka/current/akka/actor/typed/scaladsl/Behaviors $。html#receiveMessageT:akka.actor.typed.scaladsl.Behaviors.Receive [T]的链接

1 个答案:

答案 0 :(得分:2)

因为receiveMessage[A]仅在符合类型A的消息上匹配,并且您无法声明包含A的系统消息的类型PostStop等等。相反,Akka型的专用receiveSignal

以您的示例为例,当您已经通过Behavior.setup捕获共享上下文时,可以将receiveSignal链接到消息行为以成为同一行为的一部分:

Behaviors.setup { context =>
      val greeter = context.spawn(HelloWorld.greeter, "greeter")

      Behaviors.receiveMessage { message =>
        val replyTo = context.spawn(HelloWorldBot.bot(greetingCounter = 0, max = 3), message.name)
        greeter ! HelloWorld.Greet(message.name, replyTo)
        Behaviors.same
      }.receiveSignal {
         case (context, PostStop) =>
           context.log.info("behavior stopped")
           Behaviors.same
    }