2016-09-27 38 views
1

我目前玩2.4.2,并使用成功创建线程池下面的以下内容:如何在Play 2.5.x中创建线程池?

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) 

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

有没有人成功地创建了播放2.5.X,可以帮助出线程池?它是否像将类改变为类一样简单,然后将其注入到我想要使用此线程的任何位置?似乎奇怪,因为使用默认的ExecutionContext我只需要进行隐式导入。

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

+2

隐含查找发生的类型,你不想在隐含范围相同类型的多个对象,所以我不会在这里做的隐含注解。根据需要通过'implicit val ec = Contexts.db'或任何您需要的方法进入范围。 – Reactormonk

回答

4

如果你简单地改变你的Contexts一类,那么你将不得不面对如何让这个类的一个实例。

在我看来,如果你有一个数字,你想使用线程池,取名绑定的路要走。在下面的例子中,我会告诉你如何用guice完成这个任务。

请注意,guice注入依赖at runtime,但也可以注入依赖关系compile time

我会用作为一个例子分贝范围内表现出来。首先,这是你将如何使用它:

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中的绑定。

请注意,我还没有尝试过。你可能会遇到的一个问题可能是你最终会遇到冲突,因为游戏已经在BuiltinModule中定义了ExecutionContext的绑定。您可能需要重写绑定才能解决该问题。

相关问题