【问题标题】:How to execute on start code in scala Play! framework application?如何在 scala Play 中执行启动代码!框架应用?
【发布时间】:2013-01-15 21:52:06
【问题描述】:

我需要执行一个代码,允许在应用程序启动时启动计划作业,我该怎么做?谢谢。

【问题讨论】:

    标签: scala playframework-2.0 scheduled-tasks startup


    【解决方案1】:

    使用Global 对象,如果使用该对象,则必须在默认包中定义:

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

    请记住,在开发模式下,应用仅在第一个请求时加载,因此您必须触发请求才能启动进程。


    自 Play Framework 2.6x

    正确的做法是使用带有急切绑定的自定义模块:

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

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

    【讨论】:

    • 我在最后添加了一个注释,因为这让我很生气,希望你不要介意。
    • Play 2 的默认包在哪里?
    • @poliu2s:我认为它是 app/ 文件夹。
    • 对于任何查看这篇文章的人来说,新的方法是使用模块和热切的投标。见playframework.com/documentation/2.6.x/…
    【解决方案2】:

    我遇到了类似的错误。 就像@Leo 说的,在 app/ 目录中创建全局对象。

    我唯一需要确保的是将“app: Application”更改为“app: play.api.Application”。

    app:应用程序引用控制器包中的类应用程序。

    【讨论】:

      猜你喜欢
      • 2016-07-27
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多