Play Framework 2.1 - 找不到隐式 ExecutionContext

Posted

技术标签:

【中文标题】Play Framework 2.1 - 找不到隐式 ExecutionContext【英文标题】:Play Framework 2.1 - Cannot find an implicit ExecutionContext 【发布时间】:2013-02-04 09:11:59 【问题描述】:

我正在调用这样的网络服务:

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

【问题讨论】:

【参考方案1】:

根据this issue,它已在文档中修复。我需要添加以下导入:

import play.api.libs.concurrent.Execution.Implicits._

【讨论】:

关于执行上下文。有些人认为它与 Scala 全局上下文是一回事。然而事实并非如此。 Execution.scala 指向 Invoker.scala 所以它实际上是 Play 演员系统的执行上下文。这允许您使用 application.conf 更改行为 “此问题”链接现已损坏。 web.archive 上有一个存档:web.archive.org/web/20140222113140/http://… @EdgeCaseBerg 谢谢,我已经调整了链接 链接再次断开 @dlite922 感谢您的报告。可惜互联网没有永久链接。【参考方案2】:

从 Play 2.6 开始,建议对 execution context 使用 guice 依赖注入。

默认执行上下文注入:

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

【讨论】:

您的代码没有注入执行上下文。它仍然使用隐式解析来获取执行上下文。 根据 Play 文档(至少 2.6),@mgosk 的答案是标准;见:playframework.com/documentation/2.6.x/… 然而,还有更多。你也可以扩展/定义CustomExecutionContext。请参阅:playframework.com/documentation/2.6.x/… 和 playframework.com/documentation/2.6.x/…

以上是关于Play Framework 2.1 - 找不到隐式 ExecutionContext的主要内容,如果未能解决你的问题,请参考以下文章

Netbeans + Scala + play-framework:找不到 index.html

Play Framework - 我在哪里可以找到发行说明或“新增功能”文档?

Play Framework 2.2.2 中的 OAuth

在play framework 2.4中,如何访问ssl socket(或ssl client cert)

Play Framework - 不同语言的 TemplateLoader

如何在 IntelliJ 中运行 Play Framework 2.1 项目?