2016-11-29 75 views
0

我有一个使用play 2.5框架开发的宁静的网络服务。 我想通过调用自己来启动我的Web服务。这是为了确保我的服务完全正常运行。播放2.5启动网络服务

我采取的方法是使用eagerBinding。但是类中的代码使用注入的渴望结合被执行之前的应用程序启动

这里是我的eagerbinding代码看起来像

@Singleton 
class PrimingMe @Inject()(ws: WSClient) { 

    isServicePrimed 

    def isServicePrimed: Boolean = { 

    println("PRIME ME!!!") 
    val response = ws.url("http://localhost:9000/index").get 
     .map { 
     response => 
      response.status match { 
      case 200 => true 
      case _ => false 
      } 
     } 

    try { 
     Await.result(response, 5.second) 
    } catch { 
     case _ => false 
    } 

    } 

} 


class ServiceInjectionModule extends AbstractModule { 

    def configure(): Unit = { 

    bind(classOf[PrimingMe]).asEagerSingleton 
    } 
} 

内application.conf

play.modules.enabled += "util.ServiceInjectionModule" 

我想用虚拟服务调用来填充我的应用程序,这样当真正的流量开始时,所有的数据库连接都会被创建。目前,我对服务的第一个API调用比平时花费的时间长得多。我还有什么其他选择可以实现这一点。

回答

2

否目的不被击败。急切的加载仍然按预期工作。

确保util.ServiceInjectionModule是第一个通过在application.conf文件的顶部声明加载的模块。

我已经看到了你的问题,以证明后做了一个小实验这个

这是我模块的样子。它是在根目录申报和模块是根主任即应用程序,您不必明确添加到application.conf

class Module extends AbstractModule { 
    override def configure() = { 
    //It is very important for this call to be on the top. 
    bind(classOf[Initialize]).asEagerSingleton() 
    } 
} 

渴望单身

import com.google.inject.Inject 
import com.google.inject.Singleton 
import play.api.Logger 
import play.api.libs.ws.WSClient 

import scala.concurrent.Await 
import scala.concurrent.duration.Duration 

@Singleton 
class Initialize @Inject() (wsClient: WSClient) { 

    hit() 

    def hit(): Unit = { 
    val f = wsClient.url("http://www.google.com").get() 
    val result = Await.result(f, Duration.Inf) 
    Logger.info(s"status: ${result.status}") 
    } 
} 

输出:

[info] application - status: 200 
[info] play.api.Play - Application started (Dev) 

从上面的输出中可以看到Module已经加载并调用了hit()

+0

为什么它必须是第一个模块? – rethab

+0

@rethab以防万一初始化顺序很重要... – pamu

+0

这是正确的工作,我不得不开始我的应用程序与sbt编译开始。然而问题是我不能在服务开始之前就打电话给'我自己'。让我重述一下这个问题。 – konquestor