【发布时间】:2013-01-15 21:52:06
【问题描述】:
我需要执行一个代码,允许在应用程序启动时启动计划作业,我该怎么做?谢谢。
【问题讨论】:
标签: scala playframework-2.0 scheduled-tasks startup
我需要执行一个代码,允许在应用程序启动时启动计划作业,我该怎么做?谢谢。
【问题讨论】:
标签: scala playframework-2.0 scheduled-tasks startup
使用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
【讨论】:
我遇到了类似的错误。 就像@Leo 说的,在 app/ 目录中创建全局对象。
我唯一需要确保的是将“app: Application”更改为“app: play.api.Application”。
app:应用程序引用控制器包中的类应用程序。
【讨论】: