Actors 中 future 的执行上下文

2024-03-23

我有一个 Actor,并且在某些消息上我正在运行一些返回 Future 的方法。

 def receive: Receive = {

    case SimpleMessge() =>
        val futData:Future[Int] = ...
        futData.map { data =>
           ... 
        }
}

是否可以传递实际上下文来等待此数据?或者Await如果我需要这些数据,这是我能做的最好的事情简单消息?


如果您确实需要等待 future 完成后再处理下一条消息,您可以尝试如下操作:

object SimpleMessageHandler{
  case class SimpleMessage()
  case class FinishSimpleMessage(i:Int)
}

class SimpleMessageHandler extends Actor with Stash{
  import SimpleMessageHandler._
  import context._
  import akka.pattern.pipe

  def receive = waitingForMessage
  def waitingForMessage: Receive = {

    case SimpleMessage() =>
      val futData:Future[Int] = ...
      futData.map(FinishSimpleMessage(_)) pipeTo self
      context.become(waitingToFinish(sender))
  }

  def waitingToFinish(originalSender:ActorRef):Receive = {
    case SimpleMessage() => stash()

    case FinishSimpleMessage(i) =>
      //Do whatever you need to do to finish here
      ...
      unstashAll()
      context.become(waitingForMessage)

    case Status.Failure(ex) =>
      //log error here
      unstashAll()
      context.become(waitingForMessage)      
  }
}

在这种方法中,我们处理一个SimpleMessage然后切换处理逻辑来存储所有后续的SimpleMessage直到我们得到未来的结果。当我们得到结果时,无论失败与否,我们都会释放所有其他结果SimpleMessage我们在等待未来的同时收到了,并继续我们的快乐之路。

该演员只是在两种状态之间来回切换,这使得您只能完全处理一种状态SimpleMessage一次而不需要阻止未来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Actors 中 future 的执行上下文 的相关文章

随机推荐

  • GZIPOutputStream:提高压缩级别

    java util zip GZIPOutputStream不为其底层的压缩级别提供构造函数参数或设置器Deflater 有多种方法可以解决此问题 如所述here http www redirecttonull com p 134 例如 G
  • $多个变量的假设

    我想将整个笔记本的变量限制在特定范围内 有没有一种方法可以一次性做到这一点 而无需为每个变量输入不同的 asstitution 行 编辑 我想定义笔记本中所有计算的变量域 谷歌搜索帮助我更好地构建我的需求 全局定义如下 Assumption
  • Mongo::OperationFailure - 使用 from_uri 时需要登录

    我的目标是连接我的 heroku mongolab 数据库 但我不断收到此错误 Mongo OperationFailure at mongotest a b need to login file networking rb locatio
  • htaccess - 拒绝来自未经授权的域的请求

    我有一个网站 www mysite com 它有自己的IP 现在几个月以来 我看到几个域指向我的 IP 服务器 它不是共享 IP 我可以使用那些未经授权的域浏览整个网站 它们会与我的内容等一起在谷歌中建立索引 如何将我的 htaccess
  • 我可以对每个对象属性执行 jquery-tmpl 吗

    模板 each 指令非常适合迭代数组 如下所示 var myArray a b c 我想知道是否有等效的对象属性迭代 即 var myObj propOne a propTwo b propThree c 我想要一个可以让我输出的模板 ul
  • Java 泛型:返回有界泛型类型

    我有以下代码 public
  • ServletContextListener 中的 @Autowired

    我有一个类初始化应用程序 Component public class InitApp implements ServletContextListener Autowired ConfigrationService weatherConfS
  • 右值 hello world 缺少构造函数

    我试图了解更多有关右值引用的信息 但我陷入了这个最简单的示例 include
  • java 14 nullpointerException没有详细消息

    Java 14 有许多新特性 其中之一是在 NullPointerException 中显示详细消息 我安装了 Java 14 并尝试在类下编译和运行 但没有收到任何详细消息 我错过了什么吗 请帮忙 code demo temp java
  • 内存管理:NSString的stringWithCString:encoding:

    假设我从某个函数获取一个 C 字符串 char mystring SomeCFunction 我拥有这个字符串 我负责在完成后释放它 如果在 Objective C 中 我创建一个NSString using NSString mynsst
  • Laravel 5.1 iframe 中的 CSRF,如何使其工作?

    我的应用程序有一个插件 用户可以在包含表单的网站中实现该插件 问题是我得到TokenMismatchException提交表格时 从我所做的所有研究中 我可以看到 Laravel 对跨域的保护 我知道我可以禁用它 但我不知道之后如何保护表单
  • Python Selenium driver.implicitly_wait(30)

    我们使用 VM 进行开发 并使用 Jenkins 作为套件 今天早上 我们在硒测试中遇到了以前从未发生过的问题 在粘贴代码之前 重要的是要知道 selenium 测试在我的机器上有效 但在 Jenkins 上失败 而且它已经工作了一个月 c
  • 如何使用 selenium 执行网页上的所有 javascript 内容,以在完全加载的网页上查找并发送登录表单信息

    我一直在尝试制作一个 Python 脚本来登录某个网站 浏览菜单 填写表单并将其生成的文件保存到文件夹中 我一直在使用 Selenium 尝试使网站完全加载 以便我可以找到登录的元素 但我没有成功 可能是因为网站在完全加载之前执行了大量 J
  • 自定义架构名称的宏不适用于 dbt 包

    我在 dbt 包中使用自定义架构名称时遇到问题 我使用中提供的宏数据库测试文档 https docs getdbt com docs building a dbt project building models using custom s
  • 如何使用 HQL 返回 Map

    我有一张桌子 允许 id name desc 我现在在做什么 是进行返回权限对象的查询 然后以编程方式将值放入映射中 1 但我想知道是否可以制作 HQL 如果不可能 则制作本机 sql 来选择权限ID 权限名称并将它们返回到地图中 2 是否
  • 为什么 Azure Function v2 无法绑定到 CloudTable?

    我正在尝试在 Visual Studio 2019 中运行 HTTP 触发的 v2 函数 应该是写出它的输出存储到名为 历史记录 的 Azure 存储表中 我用以下方法装饰了我的函数 return Table history 我让它返回一个
  • 无法反序列化 ActorRef 以将结果发送到不同的 Actor

    我开始使用 Spark Streaming 来处理我收到的实时数据源 我的场景是 我有一个使用 with ActorHelper 的 Akka actor 接收器 然后我让 Spark 作业执行一些映射和转换 然后我想将结果发送给另一个 a
  • 即使未移动,Motionevent Action_MOVE 仍会持续触发 X 和 Y

    我正在尝试一个简单的程序 如果移动的话 它会发出声音 所以一开始我就下了 播放声音 1 从那时起 每一个动作都会持续播放声音 在计数 4 时 我已经从头开始播放了 问题是 当我不移动手指并将其放在同一个地方时 声音仍然保持 1 x 1 计算
  • 有没有办法自动将Matlab 中的结果或数据导入到Mathematica 中?

    有没有办法将结果或数据 例如矩阵 从Matlab导入到Mathematica自动地 或者有什么方法可以先运行Matlab程序 然后运行Mathematica程序自动地 感谢您提供任何有用的答案 至少有三种方法可以解决这个问题 通过 Java
  • Actors 中 future 的执行上下文

    我有一个 Actor 并且在某些消息上我正在运行一些返回 Future 的方法 def receive Receive case SimpleMessge gt val futData Future Int futData map data