Play Framework 2.1 - 找不到隐式的ExecutionContext

50

我这样调用一个 Web 服务:

WS
  .url(url)
  .get
  .map { response => // error occurs on this line
    response.status match {
      case 200 => Right(response.json)
      case status => Left(s"Problem accessing api, status '$status'")
  }
}

完整的错误信息:Error: Cannot find an implicit ExecutionContext, either require one yourself or import ExecutionContext.Implicits.global

2个回答

114
根据此问题,文档已经修复。我需要添加以下导入:
import play.api.libs.concurrent.Execution.Implicits._

7
关于执行上下文。有些人认为它与Scala全局上下文是相同的东西,但实际上并不是。Execution.scala指向Invoker.scala因此,它实际上是Play actor系统的执行上下文。这允许您通过application.conf更改行为。 - EECOLOR
“此问题”链接现在已经失效。不过在web.archive上有一个存档:http://web.archive.org/web/20140222113140/http://play.lighthouseapp.com/projects/82401/tickets/899-error-cannot-find-an-implicit-executioncontext-either-require-one-yourself-or-import-executioncontextimplicitsglobal - EdgeCaseBerg
@EdgeCaseBerg 谢谢,我已经调整了链接。 - EECOLOR
链接又挂了。 - dlite922
@dlite922 感谢您的报告。很遗憾互联网没有持久链接。 - EECOLOR
显示剩余2条评论

2
自从 Play 2.6 版本以来,推荐使用 guice 依赖注入来管理执行上下文(execution context)。
默认情况下,可以进行执行上下文的注入。

Foo.scala

class Foo @Inject()()(implicit ec:ExecutionContext) {

def bar() = {
   WS.url(url)
     .get
     .map { response => // error occurs on this line
       response.status match {
         case 200 => Right(response.json)
         case status => Left(s"Problem accessing api, status '$status'")
     }
   }
}

自定义执行上下文注入:

application.conf

# db connections = ((physical_core_count * 2) + effective_spindle_count)
fixedConnectionPool = 9

database.dispatcher {
  executor = "thread-pool-executor"
  throughput = 1
  thread-pool-executor {
    fixed-pool-size = ${fixedConnectionPool}
  }
}

DatabaseExecutionContext.scala

@Singleton 
class DatabaseExecutionContext @Inject()(system: ActorSystem) extends CustomExecutionContext(system,"database.dispatcher")

Foo.scala

class Foo @Inject()(implicit executionContext: DatabaseExecutionContext ) {   ...    }

更多信息请参见:

https://www.playframework.com/documentation/2.6.x/Migration26#play.api.libs.concurrent.Execution-is-deprecated https://www.playframework.com/documentation/2.6.x/Highlights26#CustomExecutionContext-and-Thread-Pool-Sizing


你的代码没有注入执行上下文,仍然使用隐式解析来获取执行上下文。 - EECOLOR
1
根据Play文档(至少2.6),@mgosk的回答是标准的;请参见:https://www.playframework.com/documentation/2.6.x/ThreadPools#Using-the-default-thread-pool - juanmirocks
然而,这还不止于此。您也可以扩展/定义CustomExecutionContext。参见:https://www.playframework.com/documentation/2.6.x/Migration26#play.api.libs.concurrent.Execution-is-deprecated和https://www.playframework.com/documentation/2.6.x/Highlights26#CustomExecutionContext-and-Thread-Pool-Sizing - juanmirocks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接