springboot如何開(kāi)啟一個(gè)監(jiān)聽(tīng)線(xiàn)程執(zhí)行任務(wù)
springboot開(kāi)啟一個(gè)監(jiān)聽(tīng)線(xiàn)程執(zhí)行任務(wù)
public class StartApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
ApplicationContext applicationContext = contextRefreshedEvent.getApplicationContext();
ApplicationContext parent = applicationContext.getParent();
if (parent == null) {
CacheManager cacheManager = applicationContext.getBean(CacheManager.class);
Cache cache = cacheManager.getCache(MsConstants.NODE_CACHE_NAME);
new Thread(new Runnable() {
@Override
public void run() {
//代碼
}
}).start();
}
}
public static void main(String[] args) {
SpringApplication app = new SpringApplication(FigureServerApplication.class);
app.addListeners(new StartApplicationListener());
app.run(args);
}
springboot中監(jiān)聽(tīng)事件的創(chuàng)建流程
事件監(jiān)聽(tīng)有同步和異步兩種方式,springboot項(xiàng)目中提供了一個(gè)用于異步處理的注解:@Async。
事件的大體步驟
- 1:定義一個(gè)事件。
- 2: 創(chuàng)建一個(gè)監(jiān)聽(tīng)器。
- 3:確保監(jiān)聽(tīng)器在容器內(nèi)。
- 4:發(fā)布事件,進(jìn)行測(cè)試。
廢話(huà)不多說(shuō),簡(jiǎn)單敘述幾個(gè)不同方式的demo。
首先,我們先創(chuàng)建一個(gè)springboot項(xiàng)目。
第一種
1:定義一個(gè)事件,需要繼承ApplicationEvent
public class MyEvent extends ApplicationEvent {
? ? public MyEvent(Object source) {
? ? ? ? super(source);
? ? ? ? System.out.println("我是一個(gè)事件,目前在事件的構(gòu)造器內(nèi)");
? ? }
}2:創(chuàng)建一個(gè)監(jiān)聽(tīng)器。直接實(shí)現(xiàn)ApplicationListener接口,重寫(xiě)其中onApplicationEvent方法.
public class MyEventListener implements ApplicationListener<MyEvent> {
? ? @Override
? ? public void onApplicationEvent(MyEvent event) {
? ? ? ? System.out.println("現(xiàn)在開(kāi)始執(zhí)行監(jiān)聽(tīng)器中的內(nèi)容,我是直接實(shí)現(xiàn)ApplicationListener接口的方式進(jìn)行的");
? ? ? ? System.out.println("event.getSource() = " + event.getSource());
? ? }
}3:將監(jiān)聽(tīng)器手動(dòng)添加進(jìn)應(yīng)用容器內(nèi),并進(jìn)行發(fā)布事件。
@SpringBootApplication
public class EventTestApplication {
? ? public static void main(String[] args) {
// ? ? ? ?SpringApplication.run(EventTestApplication.class, args);
? ? ? ? //第一種:自己手動(dòng)將監(jiān)聽(tīng)器添加到application中
? ? ? ? SpringApplication application = new SpringApplication(EventTestApplication.class);
? ? ? ? //添加監(jiān)聽(tīng)器
? ? ? ? application.addListeners(new MyEventListener());
? ? ? ? ConfigurableApplicationContext context = application.run(args);
? ? ? ? //進(jìn)行發(fā)布事件
? ? ? ? context.publishEvent(new MyEvent("Event數(shù)據(jù)源"));
? ? ? ? context.close();
? ? }
}4:?jiǎn)?dòng)主啟動(dòng)類(lèi),進(jìn)行打印測(cè)試。
第二種
1:同第一種的1
2:創(chuàng)建一個(gè)監(jiān)聽(tīng)器。
/**
?*第二種:打上Compoent注解, ?將事件監(jiān)聽(tīng)器自動(dòng)加入到應(yīng)用容器中
?* 這種方式不需要手動(dòng)加入到容器中。
?* */
@Component
public class MyEventListener2 implements ApplicationListener<MyEvent> {
? ? @Override
? ? public void onApplicationEvent(MyEvent event) {
? ? ? ? System.out.println("現(xiàn)在開(kāi)始執(zhí)行監(jiān)聽(tīng)器中的內(nèi)容,我是打Compoent注解的方式進(jìn)行的");
? ? ? ? System.out.println("event.getSource() = " + event.getSource());
? ? }
}3:發(fā)布事件,后續(xù)進(jìn)行啟動(dòng)類(lèi)測(cè)試即可。
@SpringBootApplication
public class EventTestApplication {
? ? public static void main(String[] args) {
? ? ? ? ConfigurableApplicationContext context = SpringApplication.run(EventTestApplication.class, args);
? ? ? ? //發(fā)布事件
? ? ? ? context.publishEvent(new MyEvent("source"));
? ? ? ? context.close();
? ? }
}第三種
全部采用注解的方式
1:同第一種的1
2:創(chuàng)建一個(gè)監(jiān)聽(tīng)器。
/**
?*第三種:采用@EventListener注解的方式,不需要在類(lèi)上實(shí)現(xiàn)ApplicationListener接口。
?* 直接采用的是通過(guò)注解,將方法標(biāo)識(shí)為一個(gè)監(jiān)聽(tīng)器。
?* */
@Component
public class MyEventListener3 {
? ? @Async//異步注解。開(kāi)啟一個(gè)新線(xiàn)程。 去掉此注解則會(huì)變成同步監(jiān)聽(tīng)。
? ? @EventListener(classes = MyEvent.class)
? ? public void TestListener(MyEvent myEvent){
? ? ? ? System.out.println("我是@EventListener注解的方式實(shí)現(xiàn)的監(jiān)聽(tīng)器");
? ? ? ? System.out.println("myEvent.getSource() = " + myEvent.getSource());
? ? }
}3:發(fā)布事件,后續(xù)進(jìn)行啟動(dòng)類(lèi)測(cè)試即可。
@SpringBootApplication
public class EventTestApplication {
? ? public static void main(String[] args) {
? ? ? ? ConfigurableApplicationContext context = SpringApplication.run(EventTestApplication.class, args);
? ? ? ? //發(fā)布事件
? ? ? ? context.publishEvent(new MyEvent("source"));
? ? ? ? context.close();
? ? }
}以上就是三種創(chuàng)建的方式。
下面是代碼的結(jié)構(gòu)圖:

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot中使用@scheduled定時(shí)執(zhí)行任務(wù)的坑
- idea中同一SpringBoot項(xiàng)目多端口啟動(dòng)
- SpringBoot項(xiàng)目啟動(dòng)報(bào)錯(cuò)踩坑實(shí)戰(zhàn)記錄
- springboot配置項(xiàng)目啟動(dòng)后自動(dòng)打開(kāi)瀏覽器訪(fǎng)問(wèn)項(xiàng)目方式
- springboot項(xiàng)目啟動(dòng)后執(zhí)行方法的三種方式
- Springboot項(xiàng)目啟動(dòng)到一半卡住了,不報(bào)錯(cuò)問(wèn)題及解決
- SpringBoot項(xiàng)目啟動(dòng)執(zhí)行任務(wù)的多種方法小結(jié)
相關(guān)文章
SpringBoot中配置Web靜態(tài)資源路徑的方法
這篇文章主要介紹了SpringBoot中配置Web靜態(tài)資源路徑的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
JSP頁(yè)面無(wú)法識(shí)別EL表達(dá)式問(wèn)題解決方案
這篇文章主要介紹了JSP頁(yè)面無(wú)法識(shí)別EL表達(dá)式問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
java equals和=,==的區(qū)別詳細(xì)介紹
這篇文章主要介紹了java equals和=,==的區(qū)別,學(xué)習(xí)Java的朋友對(duì)equals 和== 這個(gè)概念開(kāi)始使用的時(shí)候會(huì)有疑問(wèn),很難辨別如何正確使用,這里幫大家詳細(xì)講解該知識(shí)點(diǎn),希望大家能掌握,有需要的小伙伴可以參考下2016-10-10
SpringCloud實(shí)現(xiàn)灰度發(fā)布的方法步驟
本文主要介紹了SpringCloud實(shí)現(xiàn)灰度發(fā)布的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05

