【问题标题】:PlayFramework 2.4 run some code after application has startedPlayFramework 2.4 在应用程序启动后运行一些代码
【发布时间】:2015-10-06 02:17:21
【问题描述】:

在play 2.4中,覆盖ApplicationLoader中的builder方法或在Abstract模块中实现EagerBinding,替代了现有play 2.3的GlobalSettings onStart。

然而在 play 2.3 onStart 方法中,您的应用程序已经启动并加载了所有插件/依赖项。你可以在 play 2.4 中做同样的事情吗,即在应用程序启动后运行一段代码。

在我的情况下,Slick 要求应用程序在访问数据库之前已经启动。

谢谢

【问题讨论】:

    标签: playframework playframework-2.4


    【解决方案1】:

    众所周知,当您在Module 中急切地绑定一个类时,它会尝试尽快初始化它的一个实例。在 play framework 2.4 中,这是您在应用程序启动之前获取运行代码的方式。

    但遵循 DI 的常见预期规则: 如果,在您要运行的类的构造函数中,您将作为参数(也称为“依赖项”)添加到app: Application,那么它将在应用程序启动后执行;像这样:

    import play.api.Application
    import javax.inject.Inject
    
    class MyInitCodeClass @Inject() (val app: Application) {
    
    //YOUR CODE HERE
    
    }
    

    这是合乎逻辑的,因为任何值得一提的 DI 框架都会计算出他可以按什么顺序注入哪些类。

    然后在你的模块中添加通常的绑定(这里是 playframework 样式而不是 Guice):

    bind[MyInitCodeClass] toSelf eagerly()
    

    希望这可行。停止使用 Play.current 并使用 Play 2.4 的新 DI 系统注入应用程序也很有用。

    我想感谢playframework gitter room 上的@easel 帮助我完成那个。

    【讨论】:

    • 您好,谢谢您的回答,看起来很不错,但实际上我直到现在还没有时间尝试。我可以将应用程序绑定到它,但是在运行代码之前应用程序的状态仍然没有启动。我也尝试通过执行“Play.start(app)”自己启动它,这并不理想,并且在生产中造成了一些问题。
    • 此解决方案适用于 Play 2.6.19 和 Java,但我必须小心不要出现依赖圈。
    【解决方案2】:

    罗伊,没完全明白你的问题。

    您在使用 EagerBinding 时遇到您提到的问题吗?

    如果你愿意,你仍然可以使用 GlobalSettings onStart、beforeStart 等,只是不鼓励使用它,因为你希望远离全局状态。

    【讨论】:

    • 您好,感谢您的回复。是的,您仍然可以使用 GlobalSettings onStart,但由于它已被弃用并且将来会被删除,我不希望继续使用它。我面临的问题是 slick 需要一个正在运行的应用程序才能查询数据库(即必须调用 Play.start(app) )。使用 EagerBindings,我可以在应用程序启动之前而不是之后执行任务。干杯
    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 2016-12-31
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多