【问题标题】:could not find implicit value for parameter timeout: akka.util.Timeout找不到参数超时的隐式值:akka.util.Timeout
【发布时间】:2016-12-15 17:39:09
【问题描述】:

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

我可以在不阻塞的情况下向其他参与者请求消息吗?

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    ask 需要一个隐含的Timeout,之后它只会使用TimeoutException 使Future 失败。

    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.

    【讨论】:

      【解决方案2】:

      你可以。但不要使用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
        }
      }
      

      在这种情况下,我正在向 LongRunningTaskPerformer 演员发送消息 PerformTask。当未来完成时,结果将发送到我的QueryPerformer。没有阻塞。很简单。

      【讨论】:

        猜你喜欢
        • 2016-06-21
        • 1970-01-01
        • 2017-02-02
        • 2016-01-17
        • 2011-10-17
        • 2016-03-31
        • 2015-01-27
        • 1970-01-01
        • 2016-02-27
        相关资源
        最近更新 更多