找不到参数超时的隐含值:akka.util.Timeout

时间:2016-12-15 17:39:09

标签: scala akka

我有这个代码,我在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回调。

我可以在不阻止的情况下向其他演员发出消息吗?

2 个答案:

答案 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。没有阻止。容易。