scala - 等待 N 秒让演员在 Scala 中返回
问题描述
我正在开发一个使用 Akka 演员来处理一些后端进程的项目。我创建了一个调用 Actor 的方法,但是它不会立即返回。因此,我想要 5 秒的超时,所以如果 Actor 在 5 秒内返回,我的方法将返回 this,如果没有,则返回一个默认值。
需要明确的是,调用 Actor 方法的方法本身并不在另一个 Actor 中,它只是一个常规类。其次,我尝试过使用Timeout
and 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
以确保它没有损坏,但即使没有打印。
解决方案
询问模式需要发送回复,而您的演员不发送回复:
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()
}
推荐阅读
- c# - try-catch 不会捕获在显式等待期间引发的异常
- swift - Swift如何跳转到下一个uitextfield
- python - 将类对象数据发送到不同的类
- linux - 通过符号链接的路径歧义
- docker - 码头工人网络如何工作?
- angular - Angular 6 ngb-modal 与 RxJS 和 BehaviorSubject 不工作
- javascript - Javascript DOM 添加/删除事件
- object - 加快对象检测的预测
- python - 以数值稳定的方式评估 log(1 - normal_cdf(x))
- java - 来自 KieSession.startProcess 的 UnsupportedOperationException