Play 2.4 - 在 Eager 单例模块中使用 Ebean

Posted

技术标签:

【中文标题】Play 2.4 - 在 Eager 单例模块中使用 Ebean【英文标题】:Play 2.4 - using Ebean in eager singleton module 【发布时间】:2016-01-07 15:53:18 【问题描述】:

我有一个问题。

我正在使用带有 Ebean 的 Play Framework。我正在尝试将我的应用程序移植到 Play 2.4,并且我正在尝试使用 Play 中引入的依赖注入技术。

在以前的版本中,我使用 GlobalSettings.onStart() 在应用程序启动后初始化一些东西(类似 cron 的服务)。在 2.4 中,我正在尝试使用依赖注入框架将“onStart”进程实现为热切加载的单例。

一般来说,它是有效的。但是,有时,我在启动应用程序时收到 NullPointerException。从堆栈跟踪中,我可以假设访问数据库时发生异常(当时 EbeanServer 为空)。所以我认为,Ebean 没有正确启动,因为在应用程序启动之前初始化了热切的单例。好的,我将 Play 的 Application 和 Database 对象注入到急切的单例构造函数中,以便及时启动一切。

结果……不稳定。有时应用程序启动正常,有时它会陷入相同的 NullPointerException。

看起来数据库有时没有及时启动或什么?或者我可能需要注入一些其他 Ebean 对象才能启动数据库?

【问题讨论】:

你能举一个抛出异常的代码示例吗?我有类似的设置,Ebean 按预期工作 【参考方案1】:

好的,我想通了。

我不得不注入 play.db.ebean.EbeanConfigplay.api.db.evolutions.DynamicEvolutions,现在 Ebean 作为我热切的单例的依赖项更早地开始了。

这两个类是在加载 play-ebean 插件时注入的,您可以在此处看到 https://github.com/playframework/play-ebean/blob/master/play-ebean/src/main/java/play/db/ebean/EbeanModule.java

【讨论】:

这个解决方案长期有效吗?我和你有完全相同的问题,因为这个错误只发生在服务器启动的 100 分之一,所以很难知道它是否真的修复了。 是的,我还在用这个。但是我也发现,如果有准备运行的数据库演变,我的模块将无法启动(仅在调试模式下发生,因为那个红屏表示您需要应用演变)。我曾经在数据库迁移之前禁用我的模块,然后重新启用它们。由于我从 Play 的演变迁移到 FlyWay 插件,所以我不再有这个问题了。

以上是关于Play 2.4 - 在 Eager 单例模块中使用 Ebean的主要内容,如果未能解决你的问题,请参考以下文章

如何将模块添加到 Play!框架 2.4

如何以编程方式将 Play 2.4 模块的执行限制为单个主机?

在启动时向 Play 2.4 中的演员注入服务

Play Framework 2.4 - 依赖注入替换 GlobalSettings.onStart()

在 Play 1.2.4 中覆盖现有的 CRUD 模块

如何在 Play 2.6 控制器中使“CustomExecutionContext”可用于依赖注入?