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

Posted

技术标签:

【中文标题】等待 N 秒让演员在 Scala 中返回【英文标题】:Wait N seconds for actor to return in Scala 【发布时间】:2021-09-22 07:08:27 【问题描述】:

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

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

示例代码:

service.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 方法中打印出来,但之后什么也没有发生。我什至尝试在Await 之后打印“SUCCESS”以确保它没有损坏,但即使这样也没有打印出来。

【问题讨论】:

你需要提供一些代码,特别是解释你所说的“调用Actor的方法”是什么意思。你永远不应该调用一个 Actor 的方法,你应该只给它发送一条消息。如果您需要在给定时间内回复,请使用 ask 模式和超时。 嗨,关于术语的道歉,我是演员的新手。我可以提供一些示例代码。此外,我尝试了askTimeout 的方法,当我尝试打印结果时,没有打印任何内容,也没有生成正确的结果。 你有什么异常处理? Await.result 可能会抛出异常,在这种情况下,不会调用它后面的任何代码。 (并且去掉那个var,因为它根本没有必要,只需在else 分支中返回失败值) 【参考方案1】:

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

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

【讨论】:

以上是关于等待 N 秒让演员在 Scala 中返回的主要内容,如果未能解决你的问题,请参考以下文章

林子雨spark scala版编程小结

scala演员和持久性上下文

如何在 Scala 中优先考虑演员之间发送的消息?

Scala 演员和环境参考

Scala 演员 - 最糟糕的做法? [关闭]

Akka Scala 演员中的死信