Quarkus - 程序启动及终止

我们会需要在程序启动时执行一些特定的代码,或者程序结束时执行清理。 该指南解释了如何:

  • 程序启动时被通知

  • 程序停止时被通知

准备

完成本指南需要:

  • 10分钟内

  • IDE

  • 安装 JDK 1.8+ 且正确配置了 JAVA_HOME

  • Apache Maven 3.6.2+

完整代码

我们建议您按照以下各节中的说明进行操作逐步创建应用程序。但是,您可以直接下载完成后的代码。

克隆 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

  • nativejvm 模式的 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...");
    }

}
  1. 程序启动时调用

  2. 程序终止时调用

这些事件也会在 开发模式(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();
   }
}
  1. 注解了 @Startup 的每个 bean 会自动合成 StartupEvent 监听器。使用默认优先级。

  2. 程序启动时会调用 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 (就是生产模式), DEVELOPMENTTEST. 如果你运行 quarkus:devDEVELOPMENT 模式, 运行 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.

quarkus.pro 是基于 quarkus.io 的非官方中文翻译站 ,最后更新 2020/04 。
沪ICP备19006215号-8
QQ交流群:1055930959
微信群: