springboot如何開啟一個監(jiān)聽線程執(zhí)行任務
springboot開啟一個監(jiān)聽線程執(zhí)行任務
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)聽事件的創(chuàng)建流程
事件監(jiān)聽有同步和異步兩種方式,springboot項目中提供了一個用于異步處理的注解:@Async。
事件的大體步驟
- 1:定義一個事件。
- 2: 創(chuàng)建一個監(jiān)聽器。
- 3:確保監(jiān)聽器在容器內(nèi)。
- 4:發(fā)布事件,進行測試。
廢話不多說,簡單敘述幾個不同方式的demo。
首先,我們先創(chuàng)建一個springboot項目。
第一種
1:定義一個事件,需要繼承ApplicationEvent
public class MyEvent extends ApplicationEvent { ? ? public MyEvent(Object source) { ? ? ? ? super(source); ? ? ? ? System.out.println("我是一個事件,目前在事件的構造器內(nèi)"); ? ? } }
2:創(chuàng)建一個監(jiān)聽器。直接實現(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)容,我是直接實現(xiàn)ApplicationListener接口的方式進行的"); ? ? ? ? System.out.println("event.getSource() = " + event.getSource()); ? ? } }
3:將監(jiān)聽器手動添加進應用容器內(nèi),并進行發(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); ? ? ? ? //進行發(fā)布事件 ? ? ? ? context.publishEvent(new MyEvent("Event數(shù)據(jù)源")); ? ? ? ? context.close(); ? ? } }
4:啟動主啟動類,進行打印測試。
第二種
1:同第一種的1
2:創(chuàng)建一個監(jiān)聽器。
/** ?*第二種:打上Compoent注解, ?將事件監(jiān)聽器自動加入到應用容器中 ?* 這種方式不需要手動加入到容器中。 ?* */ @Component public class MyEventListener2 implements ApplicationListener<MyEvent> { ? ? @Override ? ? public void onApplicationEvent(MyEvent event) { ? ? ? ? System.out.println("現(xiàn)在開始執(zhí)行監(jiān)聽器中的內(nèi)容,我是打Compoent注解的方式進行的"); ? ? ? ? System.out.println("event.getSource() = " + event.getSource()); ? ? } }
3:發(fā)布事件,后續(xù)進行啟動類測試即可。
@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)建一個監(jiān)聽器。
/** ?*第三種:采用@EventListener注解的方式,不需要在類上實現(xiàn)ApplicationListener接口。 ?* 直接采用的是通過注解,將方法標識為一個監(jiān)聽器。 ?* */ @Component public class MyEventListener3 { ? ? @Async//異步注解。開啟一個新線程。 去掉此注解則會變成同步監(jiān)聽。 ? ? @EventListener(classes = MyEvent.class) ? ? public void TestListener(MyEvent myEvent){ ? ? ? ? System.out.println("我是@EventListener注解的方式實現(xiàn)的監(jiān)聽器"); ? ? ? ? System.out.println("myEvent.getSource() = " + myEvent.getSource()); ? ? } }
3:發(fā)布事件,后續(xù)進行啟動類測試即可。
@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é)構圖:
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot中配置Web靜態(tài)資源路徑的方法
這篇文章主要介紹了SpringBoot中配置Web靜態(tài)資源路徑的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09SpringCloud實現(xiàn)灰度發(fā)布的方法步驟
本文主要介紹了SpringCloud實現(xiàn)灰度發(fā)布的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05