akka - 根据收到的消息 ID 创建子 Actor
问题描述
父actor根据接收到的消息中的身份创建一个子actor,相同的消息ID会复用子actor。我应该怎么办?我现在正在使用这种方式。
override def receive: Receive = {
case location: DeviceLocationInfo =>
log.info(s"$location")
val settings = CacheBasicAlarmSettingInRedis(system)
.memoizeInRedisBasicAlarmSetting(location.deviceId)
settings foreach { setting =>
val actorRef = context.child(location.deviceId)
.getOrElse(context.actorOf(Props(new OverSpeedAlarm),location.deviceId))
actorRef ! location
}
case _ =>
}
解决方案
我一直使用类似的模式。有一个使用设备 ID 作为键和一个 ActorRef 作为值的 Map ——如果地图中没有给定设备 ID 的条目,则创建一个新的孩子;如果有给定设备 ID 的条目,则将消息转发给孩子。
推荐阅读
- xml - 使用 XPath 在带有 HelpNDoc 自定义模板的 XML 文件中定位节点
- android - 标准的 android 图库应用程序如何“共享”?
- scala - 如何删除显式转换
- android - 没有提供注解的方法无法提供 Android dagger
- html - JSoup 返回无效的 HTML
- git - 如何组合 `git diff --name-status` 和 `git diff --stat` 命令的输出?
- java - 如何在没有 PropertySource 的情况下加载 SpringBoot application.properties
- angular - 带有可选路由的 Angular RouterReuseStrategy
- java - KeySpec 抛出“未找到盐”- 盐不是必需的
- r - 包“officer”中的 body_replace_all_text() 方法不起作用