云原生-Quarkus應(yīng)用程序初始化和終止

通常需要在應(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...");
    }

}
  1. 應(yīng)用程序啟動(dòng)時(shí)調(diào)用的方法
  2. 應(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();
   }
}
  1. 注解了 @Startup 的每個(gè) bean 會(huì)自動(dòng)合成 StartupEvent 監(jiān)聽器棠隐。使用默認(rèn)優(yōu)先級(jí)石抡。
  2. 程序啟動(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))DEVELOPMENTTEST。如果正在運(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ā)生哑梳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绘盟,隨后出現(xiàn)的幾起案子鸠真,更是在濱河造成了極大的恐慌,老刑警劉巖龄毡,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吠卷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沦零,警方通過查閱死者的電腦和手機(jī)祭隔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來路操,“玉大人疾渴,你說我怎么就攤上這事⊥驼蹋” “怎么了程奠?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)祭钉。 經(jīng)常有香客問我,道長(zhǎng)己沛,這世上最難降的妖魔是什么慌核? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮申尼,結(jié)果婚禮上垮卓,老公的妹妹穿的比我還像新娘。我一直安慰自己师幕,他們只是感情好粟按,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霹粥,像睡著了一般灭将。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上后控,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天庙曙,我揣著相機(jī)與錄音,去河邊找鬼浩淘。 笑死捌朴,一個(gè)胖子當(dāng)著我的面吹牛吴攒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播砂蔽,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼洼怔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了左驾?” 一聲冷哼從身側(cè)響起镣隶,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤什荣,失蹤者是張志新(化名)和其女友劉穎矾缓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稻爬,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗜闻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桅锄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琉雳。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖友瘤,靈堂內(nèi)的尸體忽然破棺而出翠肘,到底是詐尸還是另有隱情,我是刑警寧澤辫秧,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布束倍,位于F島的核電站,受9級(jí)特大地震影響盟戏,放射性物質(zhì)發(fā)生泄漏绪妹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一柿究、第九天 我趴在偏房一處隱蔽的房頂上張望邮旷。 院中可真熱鬧,春花似錦蝇摸、人聲如沸婶肩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)律歼。三九已至,卻和暖如春蜂嗽,著一層夾襖步出監(jiān)牢的瞬間苗膝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辱揭,地道東北人离唐。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像问窃,于是被迫代替她去往敵國(guó)和親亥鬓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容