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

Akka、未来和关键部分

石思淼
2023-03-14
class FooActor extends Actor {
  private var state: Int = 0

  def receive = { ... }
}

假设接收处理程序调用一个返回future的操作,我们使用dispatcher作为上下文执行器来映射它,最后我们设置一个onSuccess回调来改变执行元状态。

import context.dispatcher
def receive = {
  case "Hello" => requestSomething() // asume Future[String]
    .map(_.size)
    .onSuccess { case i => state = i }
}

onsuccess回调中更改执行元的状态,甚至使用执行元调度程序作为执行上下文,这是线程安全的吗?

共有1个答案

石正卿
2023-03-14

不是(akka 2.3.4文档)。

在这种情况下,您必须做的是发送一个消息给self以改变状态。如果你需要订购,你可以使用stash和成为。类似这样的东西

import akka.actor.{Stash,Actor}
import akka.pattern.pipe
case class StateUpdate(i:int)
class FooActor extends Actor with Stash{
  private var state: Int = 0
  def receive = ready
  def ready  = {
    case "Hello" => requestSomething() // asume Future[String]
      .map(StateUpdate(_.size)) pipeTo self
      become(busy)
  } 
  def busy {
     case StateUpdate(i) => 
       state=i
       unstashAll()
       become(ready)
     case State.Failure(t:Throwable) => // the future failed
     case evt =>
       stash()   
  }
}

当然,这是一个简单的实现,您可能想要处理超时和其他东西,以避免您的执行元被卡住。

case class StateUpdate(i:int)
class FooActor extends Actor with Stash{
  private var state: Int = 0
  def receive = {
    case "Hello" => requestSomething() // asume Future[String]
      .map(StateUpdate(_.size)) pipeTo self
    case StateUpdate(i) => state=i
  } 
 类似资料:
  • 我的服务代码如下所示, 在我的AKKA HTTP路由中,我尝试从返回的未来构建,如下所示, 我不确定如何提交给响应。被传递的未来实质上是一系列预期按顺序执行的平面映射的未来。但是,我不相信这会作为分块字节流返回到客户端。 然而,我只得到最后一个未来的结果如下, 亲切地问候Meeraj

  • 我有一个场景,其中我得到一个String消息列表,我必须遍历String并调用另一个方法,这是一个长时间运行的过程。然后我必须收集这个长时间运行过程的结果并连接结果并将其发送回用户交互界面。我对Scala中的这些未来概念很陌生。我正在使用Play框架,其中字符串列表将来自用户交互界面。这是我第一次尝试实现ht场景的样子: 为简单起见,long RunningCall将只返回一个字符串。稍后我将把它

  • 我用的是Scala 2.10,Akka 2.1和Play 2.1。当我向后端发送一个http请求时,我要求一个参与者计算一些东西。如果计算结果在超时之前返回,则返回计算结果,否则返回另一个字符串。请参阅下面的代码。 演员如下: 我的问题是,即使演员在超时之前完成,未来也不会“返回”任何内容,因此超时总是过期。我做错了什么?谢谢。

  • 我在写一个小服务器。一篇博文特别推荐了这种提问模式。课程具有以下特点: 我正在检索这个数据库行,如果它不存在或发生了一些错误,我想从Spray发送一个响应来告诉客户端。 然而,使用这种模式,我不知道在哪里注入开关。 我试着把代码改成这样: Spray使用发送HTTP响应可以接受两个对象,也可以接受一个字符串/可序列化对象。我想使用双对象模式(它允许我手动编码它的标题),理想的情况应该是 有没有办法

  • 我试图在akka演员之间建立一个信息传递过程,代表主人给工人一份工作,并密切关注它。我的问题是 我在下面提出的是一个合理的方法,以及 即使不是,我也想知道如何通过期货的组成来正确完成它,为了我的未来教育。 我想要的过程是这样的 1)Master用将工作发送给Worker。它希望在5秒内得到回复,否则它认为工人失去了机会,它将不得不再次进入竞标。 2a)如果工人在5秒内没有响应,我希望主人给自己发送

  • 问题内容: 在以下代码段中: 是否有关键字从内部类引用外部类?基本上我想做的是或类似的东西,但是似乎什么也找不到。 问题答案: 通常,你用于引用外部类的封闭实例。 在你的例子中