我有这个代码,我在Scala中提出请求请求:
someActorRef ? SomeMessage()
但是,我收到此消息:
could not find implicit value for parameter timeout: akka.util.Timeout
我也试过这个:
Await.ready(someActorRef ? SomeMessage(), Duration("3 seconds")).asInstanceOf[String]
但我得到同样的信息。
无论如何,我不想阻止。我想获得一个Future
,然后再给它一个onComplete
回调。
我可以在不阻止的情况下向其他演员发出消息吗?
答案 0 :(得分:4)
ask
需要一个隐含的Timeout
,之后它将使TimeoutException
的未来失败。
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.duration._
implicit val timeout = Timeout(5 seconds)
val f = someActorRef ? SomeMessage()
请注意,5秒内不会阻止任何内容,ask
模式完全异步/非阻塞。它将返回Future
,您可以阻止(不推荐)或附加回调(如您所愿)
f.onComplete(doSomething(_))
更多信息here。
答案 1 :(得分:0)
你可以。但是不要使用ask
。只有pipe
结果发件人。例如。让我们说这是一个执行长期任务并返回未来的演员:
class LongRunningTaskPerformer extends Actor {
import context.dispatcher
override def receive: Receive = {
case PerformTask => someLongRunningTask() pipeTo sender()
}
}
class QueryPerformer extends Actor {
val longRunningTaskPerformer = context.actorOf(LongRunningTaskPerformer.props())
override def receive: Receive = {
case TriggerLongRunningTask => longRunningTaskPerformer ! PerformTask
case result @ Result => // do something with your result
}
}
在这种情况下,我向PerformTask
演员发送消息LongRunningTaskPerformer
。未来完成后,结果将发送到我的QueryPerformer
。没有阻止。容易。