我有一个演员,其创建方式如下:
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]的链接
答案 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
}