How to execute on start code in scala Play! framework application?

后端 未结 2 1784
余生分开走
余生分开走 2021-02-15 14:10

I need to execute a code allowing the launch of scheduled jobs on start of the application, how can I do this? Thanks.

相关标签:
2条回答
  • 2021-02-15 14:35

    Use the Global object which - if used - must be defined in the default package:

    object Global extends play.api.GlobalSettings {
    
      override def onStart(app: play.api.Application) {
        ...
      }
    
    }
    

    Remember that in development mode, the app only loads on the first request, so you must trigger a request to start the process.


    Since Play Framework 2.6x

    The correct way to do this is to use a custom module with eager binding:

    import scala.concurrent.Future
    import javax.inject._
    import play.api.inject.ApplicationLifecycle
    
    // This creates an `ApplicationStart` object once at start-up and registers hook for shut-down.
    @Singleton
    class ApplicationStart @Inject() (lifecycle: ApplicationLifecycle) {
    
      // Start up code here
    
      // Shut-down hook
      lifecycle.addStopHook { () =>
        Future.successful(())
      }
      //...
    }
    
    import com.google.inject.AbstractModule
    
    class StartModule extends AbstractModule {
      override def configure() = {
        bind(classOf[ApplicationStart]).asEagerSingleton()
      }
    }
    

    See https://www.playframework.com/documentation/2.6.x/ScalaDependencyInjection#Eager-bindings

    0 讨论(0)
  • 2021-02-15 14:37

    I was getting a similar error. Like @Leo said, create Global object in app/ directory.

    Only thing I had to make sure was to change "app: Application" to "app: play.api.Application".

    app: Application referred to class Application in controllers package.

    0 讨论(0)
提交回复
热议问题