【问题标题】:How do I create thread pools in Play 2.5.x?如何在 Play 2.5.x 中创建线程池?
【发布时间】:2017-02-05 11:39:07
【问题描述】:

我目前使用的是 Play 2.4.2,并已使用以下方法成功创建了线程池:

package threads

import scala.concurrent.ExecutionContext
import play.api.libs.concurrent.Akka
import play.api.Play.current

object Contexts {
  implicit val db: ExecutionContext = Akka.system.dispatchers.lookup("contexts.db-context")
  implicit val pdf: ExecutionContext = Akka.system.dispatchers.lookup("contexts.pdf-context")
  implicit val email: ExecutionContext = Akka.system.dispatchers.lookup("contexts.email-context")
}

然后在代码中...

Future{....}(threads.Contexts.db)

我们已准备好升级到 Play 2.5,但无法理解文档。 2.4.2 的文档使用 Akka.system.dispatchers.lookup,我们使用它没有问题。 2.5.x 的文档使用 app.actorSystem.dispatchers.lookup。据我所知,我必须将应用程序注入一个类,而不是一个对象。然而文档清楚地使用了一个对象作为示例!

有没有人在 Play 2.5.x 中成功创建线程池以提供帮助?是否像将 Contexts 更改为一个类一样简单,然后在我想使用此线程的任何地方注入它?似乎很奇怪,因为使用默认的 ExecutionContext 我只需要进行隐式导入。

另外,我们正在使用 Play scala。

【问题讨论】:

  • 隐式查找按类型发生,您不希望隐式范围内有多个具有相同类型的对象,所以我不会在这里做隐式注释。根据需要通过implicit val ec = Contexts.db 或任何您需要的方式进入范围。

标签: scala playframework threadpool playframework-2.5


【解决方案1】:

如果您只是将Contexts 更改为一个类,那么您将不得不处理如何获取该类的实例。

在我看来,如果您有多个线程池想要使用,命名绑定是您的最佳选择。在下面的示例中,我将向您展示如何使用 guice 完成此操作。

请注意,guice 会在 at runtime 注入依赖项,但也可以在 compile time 注入依赖项。

我将以 db 上下文为例来展示它。首先,这是你将如何使用它:

class MyService @Inject() (@Named("db") dbCtx: ExecutionContext) {
  // make db access here
}

下面是定义绑定的方法:

bind[ExecutionContext].qualifiedWith("db").toProvider[DbExecutionContextProvider]

并在某处定义提供者:

class DbExecutionContextProvider @Inject() (actorSystem: ActorSystem) extends Provider[ExecutionContext] {
  override def get(): ExecutionContext = actorSystem.dispatchers.lookup("contexts.db-context")
}

您必须针对每个上下文执行此操作。我知道这可能有点麻烦,实际上可能有更优雅的方式来定义 guice 中的绑定。

请注意,我还没有尝试过。您可能偶然发现的一个问题可能是您最终会遇到冲突,因为 play 已经在其 BuiltinModule 中定义了 ExecutionContext 的绑定。您可能需要覆盖绑定才能解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多