控制应用程序生命周期是服务能够引导一些外部资源或验证组件状态的常见要求。一种从 Java Enterprise API 借用的简单策略是包含 Undertow 扩展(或任何上层,例如休息服务),以便您可以利用 ServletContextListener,它在创建或销毁 Web 应用程序时收到通知。这是它的最小实现:
尽管在 Quarkus Web 应用程序中重用此策略非常好,但建议将此方法用于任何类型的 Quarkus 服务。这可以通过观察 io.quarkus.runtime.StartupEvent 和 io.quarkus.runtime.ShutdownEvent 事件来完成。此外,在 CDI 应用程序中,您可以使用 @Initialized(ApplicationScoped.class) 限定符观察事件,当应用程序上下文被初始化。这对于引导资源(例如数据库)特别有用,在 Quarkus 读取配置之前需要这些资源。
要查看这方面的实际示例,请查看本书 GitHub 存储库的 Chapter08/lifecycle 文件夹中的源代码。像往常一样,建议您在继续之前将项目导入您的 IDE。此示例的目的是向您展示如何在我们的客户服务中将 PostgreSQL 数据库替换为 H2 数据库(https: //www.h2database.com/)。
从配置开始,生命周期项目不再包含 PostgreSQL JDBC 依赖项。为了替换它,已包含以下内容:
为了测试我们的客户服务,我们包含了两个 H2 数据库配置文件:一个绑定到 dev 配置文件,一个绑定到 test 配置文件:
要在应用上下文启动之前绑定 H2 数据库,我们可以使用下面的 DBLifeCycleBean 类:
此类能够拦截以下事件:
- Context startup: This is captured through the observeContextInit method. The database is bootstrapped in this method.
- Application startup: This is captured through the onStart method. We are simply performing some logs when this event is fired.
- Application shutdown: This is captured through the onStop method. We are shutting down the database in this method.
现在,您可以像往常一样使用以下命令在 dev 配置文件中启动 Quarkus:
当应用启动时,会通知我们H2数据库已经启动:
然后,我们将在应用程序启动时收到更多通知,其中我们可以包含一些要完成的额外任务:
最后,当我们停止应用程序时,资源将被解除,如以下控制台日志所示:
在关闭数据库之前,您可以使用一个很小的内存数据库层来运行您的客户服务示例。