Quarkus - 程序启动及终止
我们会需要在程序启动时执行一些特定的代码,或者程序结束时执行清理。 该指南解释了如何:
-
程序启动时被通知
-
程序停止时被通知
完整代码
我们建议您按照以下各节中的说明进行操作逐步创建应用程序。但是,您可以直接下载完成后的代码。
克隆 Git 仓库: git clone https://github.com/quarkusio/quarkus-quickstarts.git
, 或下载 archive.
完整代码在 lifecycle-quickstart
目录 .
代码
我们建议你跟着下边介绍一步一步创建应用。 但是你也可以直接看完整的例子。
克隆 Git 仓库: git clone https://github.com/quarkusio/quarkus-quickstarts.git
, 或下载 存档].
代码在 lifecycle-quickstart
目录 .
创建 Maven 项目
首先,我们需要创建一个新项目,用下边命令创建:
mvn io.quarkus:quarkus-maven-plugin:1.3.1.Final:create \
-DprojectGroupId=org.acme \
-DprojectArtifactId=lifecycle-quickstart \
-DclassName="org.acme.lifecycle.GreetingResource" \
-Dpath="/hello"
cd lifecycle-quickstart
它会生成:
-
Maven 项目目录结构
-
可访问的页面
http://localhost:8080
-
native
及jvm
模式的Dockerfile
样例文件 -
应用配置文件
-
org.acme.config.GreetingResource
资源 -
一个相关测试
监听启动及关闭事件
在 org.acme.lifecycle
包中创建类 AppLifecycleBean
(或者用别的名字 ) ,然后复制下列内容:
package org.acme.lifecycle;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import io.quarkus.runtime.ShutdownEvent;
import io.quarkus.runtime.StartupEvent;
import org.jboss.logging.Logger;
@ApplicationScoped
public class AppLifecycleBean {
private static final Logger LOGGER = Logger.getLogger("ListenerBean");
void onStart(@Observes StartupEvent ev) { (1)
LOGGER.info("The application is starting...");
}
void onStop(@Observes ShutdownEvent ev) { (2)
LOGGER.info("The application is stopping...");
}
}
-
程序启动时调用
-
程序终止时调用
这些事件也会在 开发模式(dev mode) 每次重新部署时调用。 |
这些方法可以注入 beans. 详情查看类 AppLifecycleBean.java |
@Initialized(ApplicationScoped.class)
与 @Destroyed(ApplicationScoped.class)
的差异
JVM 模式中,没有真正的差别,除了 StartupEvent
总是在 @Initialized(ApplicationScoped.class)
后 触发 ShutdownEvent
在 @Destroyed(ApplicationScoped.class)
前 触发.
但是构建成原生执行文件时,@Initialized(ApplicationScoped.class)
在 原生构建处理过程 触发, StartupEvent
是在原生镜像执行时触发。
详情参考: 启动的三个阶段及 Quarkus 理念 .
在 CDI 应用中, 注解了 @Initialized(ApplicationScoped.class) 的事件是在 CDI 容器初始化时触发的。 详情参考: the spec
|
用 @Startup
在程序启动时初始化一个 CDI bean
A bean represented by a class, producer method or field annotated with @Startup
is initialized at application startup:
package org.acme.lifecycle;
import javax.enterprise.context.ApplicationScoped;
@Startup (1)
@ApplicationScoped
public class EagerAppBean {
private final String name;
EagerAppBean(NameGenerator generator) { (2)
this.name = generator.createName();
}
}
-
注解了
@Startup
的每个 bean 会自动合成StartupEvent
监听器。使用默认优先级。 -
程序启动时会调用 bean 的构造函数,并将 bean 保存到应用上下文(译者:保存到 CDI 容器)
@Dependent 类型的监听 beans 会在执行完后立即销毁.
|
如果类注解了 @Startup 但是没有注解范围会自动设置为 @ApplicationScoped .
|
打包并运行应用
使用 ./mvnw compile quarkus:dev
运行应用, 会输出日志.
应用停止时,输出第二处日志。
一般,应用可以使用 ./mvnw clean package
打包并用 -runner.jar
文件来运行。
你也可以用 ./mvnw clean package -Pnative
生成原生执行程序。
运行模式
Quarkus has 3 different launch modes, NORMAL
(i.e. production), DEVELOPMENT
and TEST
. If you are running quarkus:dev
Quarkus 有 3 种不同的运行模式, NORMAL
(就是生产模式), DEVELOPMENT
及 TEST
. 如果你运行 quarkus:dev
是 DEVELOPMENT
模式, 运行 JUnit 测试会是 TEST
模式, 其它是 NORMAL
模式.
程序可以通过注入 io.quarkus.runtime.LaunchMode
enum 到 CDI bean 来获取运行模式,
或者调用静态方法 io.quarkus.runtime.LaunchMode.current()
.
优雅的关闭
Quarkus 支持优雅的关闭,允许 Quarkus 等请求完成,或者直到超时。
默认这是禁用的,但是你可以配置 quarkus.shutdown.timeout
。
当设置后关闭会等请求处理完成或超时。
此设置项是时长,可以使用标准的 java.time.Duration
格式,如果只设置了数值则解析成秒。
Extensions that accept requests need to add support for this on an individual basis. At the moment only the HTTP extension supports this, so shutdown may still happen when messaging requests are active.