Search code examples
scalaplayframework-2.0scheduled-tasksstartup

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


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


Solution

  • 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