在Akka直接使用期货

时间:2013-01-11 10:12:15

标签: scala akka future

我无法像解释here那样创建未来。它表示您可以使用以下代码直接创建Future

import akka.dispatch.Await
import akka.dispatch.Future
import akka.util.duration._

val future  = Future {
  "Hello" + "World"
}
val result = Await.result(future, 1 second)

使用完全相同的代码,我收到错误消息,说:error: could not find implicit value for parameter executor: akka.dispatch.ExecutionContext。我能找到关于ExecutionContext的所有信息,你可以“用它来做”。在文档中,我发现的唯一一行是:

implicit val ec = ExecutionContect.fromExecutionService(yourExecutionServiceGoesHere)

但这对我没用。有人对我这个话题有什么建议吗?如何在不询问Future的情况下创建新的Actor

2 个答案:

答案 0 :(得分:7)

如果你有一个ActorSystem,那么它将有一个ExecutionContext,可以在这里使用。它必须是implicit,除非您明确将其传递给Future.apply方法。

出于演示的目的,如果您只是想在REPL中看到它是如何工作的:

implicit val system = ActorSystem("MySystem").dispatcher

ActorSystem => ExecutionContext对象上还有一个隐式转换ExecutionContext

要创建模块化代码,而不在使用点之前创建上下文,请考虑将上下文作为特征的抽象成员:

trait MyFutures {
  implicit val context: ExecutionContext

  def helloFuture: Future[String] = Future { "hello" + "world" }
}

答案 1 :(得分:3)

您的代码无法编译,因为您正在编写非法的Scala代码:Future.apply的签名清楚地表明了这一点。我假设您了解您正在调用特征Future的伴随对象的apply方法,该方法如下:

object Future extends java.lang.Object with scala.ScalaObject {
  def apply[T](body : => T)(implicit executor : akka.dispatch.ExecutionContext) : akka.dispatch.Future[T] = { /* compiled code */ }
}

由于在调用ExecutionContext时没有可用的隐式Future.apply,因此会出现编译错误。它与调用接收两个参数的方法相同,如果只提供一个参数。

如何创建ExecutionContext的问题不同,您可以在Akka文档中找到答案:

  

为了执行回调和操作,Futures需要一些东西   称为ExecutionContext,与a非常相似   java.util.concurrent.Executor。如果你有一个范围内的ActorSystem,它   将使用其默认调度程序作为ExecutionContext,或者您可以   使用ExecutionContext协同程序提供的工厂方法   对象包装Executors和ExecutorServices,甚至创建你的   自己的。