In einer Scala-basierten Play-Anwendung versuche ich, einen Singleton-Dienst zu initiieren, ohne eine Anfrage an einen Controller zu stellen. Ich bin den Anweisungen in der 2.4 API documentation gefolgt, um eine Singleton-Klasse zu erstellen und dann Guices Dependency-Injection-Bibliothek zu verwenden, um die Klasse als eager singleton zu binden.Wie initialisiere ich einen eifrigen Singleton ohne eine Controller-Anfrage in Play?
Sogar mit eifriger Bindung wird der Singleton immer noch nicht aufgerufen, nachdem ich eine Anfrage über eine Controller-Route erhalten habe. Irgendwelche Ideen, was ich falsch mache?
Modul
package models
import com.google.inject.AbstractModule
import com.google.inject.name.Names
class MessageLogModule extends AbstractModule {
def configure() = {
bind(classOf[MessageLogService]).asEagerSingleton
}
}
Konfiguration
play.modules.enabled += "models.MessageLogModule"
Singleton
package models
import javax.inject._
@Singleton
class MessageLogService {
// Create a file to test
println("IN SINGLETON - CREATING NEW FILE")
val file = new java.io.File("howdy.txt")
file.createNewFile
}
Befehl ausführen
sbt compile run
Die obige Singleton nicht genannt bekommt, bis ich eine Ausgabe von ...
curl http://localhost:9000/
Was ich will, ist für MessageLogService an dem Punkt starten Sie den Dienst läuft und nicht auf eine Anfrage warten, um einen Controller Route zu treffen.
Haben Sie versucht "sbt compile start"? Run führt während der Entwicklung einige Tricks aus. –
@ AlvaroCarrasco Super! Das war's! Kannst du das als offizielle Antwort posten, damit ich es als "Beantwortet" aussprechen kann und dir die Ehre gebe? –
Für alle anderen, die sich hierüber befinden, gibt es einen Beitrag, in dem die Unterschiede zwischen 'run' und' start' diskutiert werden: http://stackoverflow.com/questions/18213427/what-are-the-differences-between-play- run-and-start –