当前位置: 首页 > 知识库问答 >
问题:

如何用行为接收信息处理生命周期信号

田鸿彩
2023-03-14

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

    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中处理信号消息(例如PostStop),并在文档中表示:

只有一个参数的Receive的简化版本--要处理的消息。当上下文已经可以通过其他方式访问时,如包装在设置中或类似的方式,这很有用。构造一个能够对传入消息和生命周期信号做出反应的参与者行为。从另一个actor(或者作为Akka.actor.typed.actorSystem的监护人)生成这个actor之后,它将在ActorContext中执行,该ActorContext允许访问系统、生成和监视其他actor等。处理下一个消息会导致可能与此消息不同的新行为。状态是通过返回一个新的行为来维护的,该行为持有新的不可变状态。

但是如何在Behaviors.ReceiveMessage中实现生命周期信号呢?

以下是指向文档https://doc.akka.io/api/akka/current/akka/actor/typed/scaladsl/achaviors$.html#receiveMessaget:akka.actor.typed.scaladsl.Behaviors.receive[T]

共有1个答案

冯驰
2023-03-14

因为ReceiveMessage[A]只能在符合类型A的消息上进行匹配,并且您无法声明包含PostStop等系统消息的类型A。相反,Akka-Typed有一个专用的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
    }
 类似资料:
  • #include <stdio.h> #include <signal.h> void handler(int sig); void handler(int sig) { signal(sig, handler); printf("Receive signal: %d\n", sig); } int main(void) { signal(SI

  • 不想让用户浪费宝贵时间来填写身份信息?金数据可以帮你自动收集用户的微信昵称(以及头像)、性别、国家、省市以及 OpenID。 开启方法 进入表单「设置」 —— 「微信增强」,在页面上部选择「通过金数据公众号收集」或「使用自己的公众号收集」,如图 1 所示。 图1 收集用户微信信息 通过金数据公众号收集:这种情况下,用户将会看见金数据的微信公众号信息。 用户填表之前会提示是否授权金数据获取他的个人信

  • 我可以禁用POM中的特定阶段:Maven生命周期中的禁用阶段。可以从命令行禁用test:是否可以从特定阶段开始mvn生命周期,例如只使用命令行选项编译?

  • 本文向大家介绍微信小程序(四)应用生命周期详解,包括了微信小程序(四)应用生命周期详解的使用技巧和注意事项,需要的朋友参考一下 App() 函数用来注册一个小程序,注意必须在 app.js 中注册,且不能注册多个。 使用方式也跟Android中的Application中初始化一些全局信息以供使用。 方法: 应用生命周期代码: 相关文章: hello WeApp                   

  • 本文向大家介绍Android接收和发送短信处理,包括了Android接收和发送短信处理的使用技巧和注意事项,需要的朋友参考一下 关于短信接收处理方面,当前已经有一些app做的比较好了,比如发给手机发验证码验证的问题,很多app在手机接收到验证码后,不需要输入,就直接可以跳过验证界面,这就是用到了对接收到的短信的处理。至于短信的发送,也没什么好说的了。在此也只是附上一个小实例。 效果图: MainA

  • 注:本文档提供的生命周期指的是 Universal App 的生命周期,它依赖 rax-app 提供的 runApp方法。 App 级生命周期 launch  在 App 启动时触发 使用生命周期 你可以使用 rax-app 提供的 useAppLaunch 来注册 App 级别的生命周期。 示例: import { useAppLaunch } from 'rax-app'; useAppLa