2016-11-29 12 views
0

私はplay 2.5フレームワークを使用して快適なWeb​​サービスを開発しました。 私は自分自身を呼び出すことによって、自分のWebサービスを初めにプライムしたいと思っています。これは私のサービスが完全に稼働していることを確認するためです。Play 2.5 Webサービスのプライミング

私が取っているアプローチはeagerBindingです。しかし、クラス内のコードは、使用して注入された熱心なアプリが

ここ

は私eagerbindingコードは、私がしたいapplication.conf

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

インサイド

@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 
    } 
} 

次のようになります開始される直前に実行されますバインディング実際のトラフィックが始まったときにすべてのdb接続が行われるように、ダミーのサービスコールで私のアプリケーションをプライムしてください。現在、サービスへの私の最初の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

関連する問題