微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

等待 N 秒让演员在 Scala 中返回

如何解决等待 N 秒让演员在 Scala 中返回

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

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

示例代码

service.scala

Await

actorClass.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     
  }

当我运行此代码时,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”以确保它没有损坏,但即便如此也没有打印出来。

解决方法

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

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()
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。