2016-11-29 4 views
0

Ich habe einen erholsamen Web-Service mit Play 2.5 Framework entwickelt. Ich möchte meinen Web-Service beim Start durch Aufruf selbst initiieren. Dies ist, um sicherzustellen, dass mein Service perfekt läuft.Play 2.5 Priming der Web-Service

Der Ansatz, den ich nehme, verwendet eagerBinding. Aber der Code innerhalb der Klasse mit injizierten eifrig Bindung ausgeführt wird, kurz bevor die App startet

Hier ist, was Code mein eagerbinding ist sieht aus wie

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

Innen application.conf

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

Ich möchte Starten Sie meine Anwendung mit einem Dummy-Serviceanruf, sodass alle db-Verbindungen hergestellt werden, sobald der tatsächliche Datenverkehr beginnt. Momentan dauert mein erster api-Anruf viel länger als gewöhnlich. Welche anderen Optionen muss ich erreichen?

Antwort

2

Kein Zweck ist nicht besiegt. Eager Laden funktioniert immer noch wie erwartet.

Stellen Sie sicher, dass das util.ServiceInjectionModule das erste zu ladende Modul ist, indem Sie es oben in der Datei application.conf deklarieren.

Ich habe ein kleines Experiment durchgeführt, nachdem Ihre Frage sehen Dieses diese

zu beweisen, wie mein Modul aussieht. Es wird im Stammverzeichnis deklariert und als Modul im Wurzel Direktor dh App ist, Sie müssen nicht explizit auf die 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() 
    } 
} 

Eager Singletons

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}") 
    } 
} 

Ausgang hinzuzufügen:

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

Von der obigen Ausgabe können Sie sehen, dass Modul geladen hat und hit() aufgerufen wird.

+0

Warum sollte es das erste Modul sein? – rethab

+0

@rethab Nur für den Fall, dass die Reihenfolge der Initialisierung wichtig ist ... – pamu

+0

das ist richtig es funktioniert, ich musste meine Anwendung mit sbt kompilieren starten. aber das Problem ist, dass ich mich selbst nicht nennen kann, bevor der Dienst beginnt. Lass mich die Frage umformulieren. – konquestor