您好,登錄后才能下訂單哦!
這篇文章主要介紹“springboot怎么開啟一個(gè)監(jiān)聽線程執(zhí)行任務(wù)”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“springboot怎么開啟一個(gè)監(jiā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); }
事件監(jiān)聽有同步和異步兩種方式,springboot項(xiàng)目中提供了一個(gè)用于異步處理的注解:@Async。
1:定義一個(gè)事件。
2: 創(chuàng)建一個(gè)監(jiān)聽器。
3:確保監(jiān)聽器在容器內(nèi)。
4:發(fā)布事件,進(jì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)聽器。直接實(shí)現(xiàn)ApplicationListener接口,重寫其中onApplicationEvent方法.
public class MyEventListener implements ApplicationListener<MyEvent> { @Override public void onApplicationEvent(MyEvent event) { System.out.println("現(xiàn)在開始執(zhí)行監(jiān)聽器中的內(nèi)容,我是直接實(shí)現(xiàn)ApplicationListener接口的方式進(jìn)行的"); System.out.println("event.getSource() = " + event.getSource()); } }
3:將監(jiān)聽器手動添加進(jìn)應(yīng)用容器內(nèi),并進(jìn)行發(fā)布事件。
@SpringBootApplication public class EventTestApplication { public static void main(String[] args) { // SpringApplication.run(EventTestApplication.class, args); //第一種:自己手動將監(jiān)聽器添加到application中 SpringApplication application = new SpringApplication(EventTestApplication.class); //添加監(jiān)聽器 application.addListeners(new MyEventListener()); ConfigurableApplicationContext context = application.run(args); //進(jìn)行發(fā)布事件 context.publishEvent(new MyEvent("Event數(shù)據(jù)源")); context.close(); } }
4:啟動主啟動類,進(jìn)行打印測試。
1:同第一種的1
2:創(chuàng)建一個(gè)監(jiān)聽器。
/** *第二種:打上Compoent注解, 將事件監(jiān)聽器自動加入到應(yīng)用容器中 * 這種方式不需要手動加入到容器中。 * */ @Component public class MyEventListener2 implements ApplicationListener<MyEvent> { @Override public void onApplicationEvent(MyEvent event) { System.out.println("現(xiàn)在開始執(zhí)行監(jiān)聽器中的內(nèi)容,我是打Compoent注解的方式進(jìn)行的"); System.out.println("event.getSource() = " + event.getSource()); } }
3:發(fā)布事件,后續(xù)進(jìn)行啟動類測試即可。
@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)聽器。
/** *第三種:采用@EventListener注解的方式,不需要在類上實(shí)現(xiàn)ApplicationListener接口。 * 直接采用的是通過注解,將方法標(biāo)識為一個(gè)監(jiān)聽器。 * */ @Component public class MyEventListener3 { @Async//異步注解。開啟一個(gè)新線程。 去掉此注解則會變成同步監(jiān)聽。 @EventListener(classes = MyEvent.class) public void TestListener(MyEvent myEvent){ System.out.println("我是@EventListener注解的方式實(shí)現(xiàn)的監(jiān)聽器"); System.out.println("myEvent.getSource() = " + myEvent.getSource()); } }
3:發(fā)布事件,后續(xù)進(jìn)行啟動類測試即可。
@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)圖:
關(guān)于“springboot怎么開啟一個(gè)監(jiān)聽線程執(zhí)行任務(wù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。