【问题标题】:Play Framework 2.1 - Cannot find an implicit ExecutionContextPlay Framework 2.1 - 找不到隐式 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

【问题讨论】:

    标签: scala playframework playframework-2.0


    【解决方案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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    相关资源
    最近更新 更多