通常需要在應(yīng)用程序啟動(dòng)時(shí)執(zhí)行自定義操作,并在應(yīng)用程序停止時(shí)清理所有內(nèi)容品追。
主要方法
默認(rèn)情況下筐摘,Quarkus將自動(dòng)生成一個(gè)main方法,該方法將引導(dǎo)Quarkus岔乔,然后僅等待啟動(dòng)關(guān)閉酥筝。需要?jiǎng)?chuàng)建自己的main方法
package om.acme;
import io.quarkus.runtime.annotations.QuarkusMain;
import io.quarkus.runtime.Quarkus;
@QuarkusMain
public class Main {
public static void main(String ... args) {
System.out.println("Running main method");
Quarkus.run(args);
}
}
- 該注釋告訴Quarkus將此方法用作主要方法,除非它在配置中被覆蓋
- 從這啟動(dòng)Quarkus
這個(gè)主類將引導(dǎo)Quarkus并運(yùn)行它直到停止雏门。這與自動(dòng)生成的主類沒有什么不同嘿歌,但是具有的優(yōu)點(diǎn)是,可以直接從IDE直接啟動(dòng)它茁影,而無需運(yùn)行Maven或Gradle命令宙帝。
不建議在此主要方法中執(zhí)行任何業(yè)務(wù)邏輯,因?yàn)樯形丛O(shè)置Quarkus募闲,并且Quarkus可以在其他ClassLoader中運(yùn)行步脓。如果要在啟動(dòng)時(shí)執(zhí)行邏輯,請(qǐng)使用浩螺,io.quarkus.runtime.QuarkusApplication 如下所述靴患。
如果想在啟動(dòng)時(shí)實(shí)際執(zhí)行業(yè)務(wù)邏輯(或編寫完成任務(wù)然后退出的應(yīng)用程序),則需要為io.quarkus.runtime.QuarkusApplicationrun方法提供一個(gè)類要出。在啟動(dòng)Quarkus之后run鸳君,將調(diào)用該應(yīng)用程序的方法。當(dāng)此方法返回時(shí)患蹂,Quarkus應(yīng)用程序?qū)⑼顺觥?/p>
如果要在啟動(dòng)時(shí)執(zhí)行邏輯或颊,則應(yīng)調(diào)用Quarkus.waitForExit()砸紊,該方法將等待直到請(qǐng)求關(guān)閉為止(從外部信號(hào)(如按時(shí)Ctrl+C或由于線程已調(diào)用Quarkus.asyncExit()))。
package com.acme;
import io.quarkus.runtime.Quarkus;
import io.quarkus.runtime.QuarkusApplication;
import io.quarkus.runtime.annotations.QuarkusMain;
@QuarkusMain
public class Main {
public static void main(String... args) {
Quarkus.run(MyApp.class, args);
}
public static class MyApp implements QuarkusApplication {
@Override
public int run(String... args) throws Exception {
System.out.println("Do startup logic here");
Quarkus.waitForExit();
return 0;
}
}
}
注入命令行參數(shù)
可以注入在命令行中傳遞的參數(shù):
@Inject
@CommandLineArguments
String[] args;
監(jiān)聽啟動(dòng)和關(guān)閉事件
在 org.acme.lifecycle 包中創(chuàng)建類 AppLifecycleBean (或者用別的名字 ) 饭宾,然后復(fù)制下列內(nèi)容:
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) {
LOGGER.info("The application is starting...");
}
void onStop(@Observes ShutdownEvent ev) {
LOGGER.info("The application is stopping...");
}
}
- 應(yīng)用程序啟動(dòng)時(shí)調(diào)用的方法
- 應(yīng)用程序終止時(shí)調(diào)用的方法
這些事件也會(huì)在 開發(fā)模式(dev mode) 每次重新部署時(shí)調(diào)用批糟。
這些方法可以注入 beans. 詳情查看類 AppLifecycleBean.java
@Initialized(ApplicationScoped.class)和和有什么區(qū)別@Destroyed(ApplicationScoped.class)
JVM 模式中,沒有真正的差別看铆,除了 StartupEvent 總是在 @Initialized(ApplicationScoped.class) 后 觸發(fā) ShutdownEvent 在 @Destroyed(ApplicationScoped.class) 前 觸發(fā).
但是構(gòu)建成原生執(zhí)行文件時(shí)徽鼎,@Initialized(ApplicationScoped.class) 在 原生構(gòu)建處理過程 觸發(fā), StartupEvent 是在原生鏡像執(zhí)行時(shí)觸發(fā)弹惦。 詳情參考: 啟動(dòng)的三個(gè)階段及 Quarkus 理念 .
在 CDI 應(yīng)用中否淤, 注解了 @Initialized(ApplicationScoped.class) 的事件是在 CDI 容器初始化時(shí)觸發(fā)的。
用 @Startup 在程序啟動(dòng)時(shí)初始化一個(gè) CDI bean
生產(chǎn)者方法或帶有注釋的字段表示的Bean@Startup在應(yīng)用程序啟動(dòng)時(shí)初始化:
package org.acme.lifecycle;
import javax.enterprise.context.ApplicationScoped;
@Startup
@ApplicationScoped
public class EagerAppBean {
private final String name;
EagerAppBean(NameGenerator generator) {
this.name = generator.createName();
}
}
- 注解了 @Startup 的每個(gè) bean 會(huì)自動(dòng)合成 StartupEvent 監(jiān)聽器棠隐。使用默認(rèn)優(yōu)先級(jí)石抡。
- 程序啟動(dòng)時(shí)會(huì)調(diào)用 bean 的構(gòu)造函數(shù),并將 bean 保存到應(yīng)用上下文(譯者:保存到 CDI 容器)
@Dependent 類型的監(jiān)聽 beans 會(huì)在執(zhí)行完后立即銷毀.
如果類注解了 @Startup 但是沒有注解范圍會(huì)自動(dòng)設(shè)置為 @ApplicationScoped .
打包并運(yùn)行應(yīng)用程序
使用 ./mvnw compile quarkus:dev 運(yùn)行應(yīng)用, 會(huì)輸出日志. 應(yīng)用停止時(shí)助泽,輸出第二處日志啰扛。
一般,應(yīng)用可以使用 ./mvnw clean package 打包并用 -runner.jar 文件來運(yùn)行嗡贺。 也可以用 ./mvnw clean package -Pnative 生成原生執(zhí)行程序隐解。
運(yùn)行模式
Quarkus具有3種不同的啟動(dòng)模式NORMAL(即生產(chǎn))DEVELOPMENT和TEST。如果正在運(yùn)行诫睬,quarkus:dev 則模式為DEVELOPMENT煞茫;如果正在運(yùn)行JUnit測(cè)試,則模式為TEST摄凡,否則為NORMAL续徽。
您的應(yīng)用程序可以通過將io.quarkus.runtime.LaunchMode枚舉注入CDI bean或調(diào)用static方法來獲得啟動(dòng)模式io.quarkus.runtime.LaunchMode.current()。
優(yōu)雅的關(guān)閉
Quarkus支持平穩(wěn)關(guān)閉亲澡,這使Quarkus可以等待運(yùn)行請(qǐng)求完成钦扭,直到設(shè)置的超時(shí)時(shí)間為止。默認(rèn)情況下谷扣,它是禁用的土全,但是您可以通過設(shè)置quarkus.shutdown.timeout config屬性來配置它。設(shè)置此選項(xiàng)后会涎,直到所有正在運(yùn)行的請(qǐng)求都已完成裹匙,或者直到該超時(shí)時(shí)間結(jié)束,才會(huì)發(fā)生關(guān)機(jī)末秃。此配置屬性是一個(gè)持續(xù)時(shí)間概页,可以使用標(biāo)準(zhǔn)java.time.Duration格式設(shè)置 ,如果僅指定數(shù)字练慕,則將其解釋為秒惰匙。
接受請(qǐng)求的擴(kuò)展需要單獨(dú)添加對(duì)此的支持技掏。目前只有HTTP擴(kuò)展支持此功能,因此當(dāng)郵件請(qǐng)求處于活動(dòng)狀態(tài)時(shí)项鬼,關(guān)閉仍可能發(fā)生哑梳。