首页 > 解决方案 > 等待 N 秒让演员在 Scala 中返回

问题描述

我正在开发一个使用 Akka 演员来处理一些后端进程的项目。我创建了一个调用 Actor 的方法,但是它不会立即返回。因此,我想要 5 秒的超时,所以如果 Actor 在 5 秒内返回,我的方法将返回 this,如果没有,则返回一个默认值。

需要明确的是,调用 Actor 方法的方法本身并不在另一个 Actor 中,它只是一个常规类。其次,我尝试过使用Timeoutand Await,即使在导入它们时,它也说找不到它们。

示例代码:

服务.scala

override def foo(): MyType = {
      var toReturn = MyType(fale, None, None)
      implicit val timeout: Timeout = 5.seconds
      val result = Await.result(myActor ? fetchData, timeout.duration).asInstanceOf[MyType]
      if(result.healthy == true){
          toReturn = result
      }
      toReturn     
  }

actorClass.scala

override def receive: Receive = {
    case fetchData => 
      actorFoo()
    case _ =>
      logger.error("...")
  }

...

private def actorFoo(): MyType = {
    val num1 = list1.size
    val num2 = list2.size
    val data = MyType(true, Some(num1), Some(num2))
    println(data)
    data
  }

当我运行此代码时,data会在方法中打印actorFoo,但之后什么也没有发生。我什至尝试在之后打印“SUCCESS”Await以确保它没有损坏,但即使没有打印。

标签: scalaasynchronoustimeoutakkaakka-actor

解决方案


询问模式需要发送回复,而您的演员不发送回复:

override def receive: Receive = {
    case fetchData => 
      actorFoo()
    case _ =>
      logger.error("...")
  }


private def actorFoo(): MyType = {
    val num1 = list1.size
    val num2 = list2.size
    val data = MyType(true, Some(num1), Some(num2))
    println(data)
    data
  }

actorFoo()结果类型为MyType,但结果通过静默转换被丢弃Unit(这是一个 Scala 疣......启用-Ywarn-value-discard将显示警告)。

要将结果显式发送actorFoo()给请求者,请尝试以下操作:

override def receive: Receive = {
  case fetchData =>
    sender ! actorFoo()
}

推荐阅读