欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot如何開啟一個監(jiān)聽線程執(zhí)行任務

 更新時間:2023年02月28日 14:34:54   作者:KillCom  
這篇文章主要介紹了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)資源路徑的方法

    這篇文章主要介紹了SpringBoot中配置Web靜態(tài)資源路徑的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 解讀@RabbitListener起作用的原理

    解讀@RabbitListener起作用的原理

    這篇文章主要介紹了解讀@RabbitListener起作用的原理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • JSP頁面無法識別EL表達式問題解決方案

    JSP頁面無法識別EL表達式問題解決方案

    這篇文章主要介紹了JSP頁面無法識別EL表達式問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • java equals和=,==的區(qū)別詳細介紹

    java equals和=,==的區(qū)別詳細介紹

    這篇文章主要介紹了java equals和=,==的區(qū)別,學習Java的朋友對equals 和== 這個概念開始使用的時候會有疑問,很難辨別如何正確使用,這里幫大家詳細講解該知識點,希望大家能掌握,有需要的小伙伴可以參考下
    2016-10-10
  • MyBatis流式查詢的使用詳解

    MyBatis流式查詢的使用詳解

    流式查詢指的是查詢成功后不是返回一個集合而是返回一個迭代器,應用每次從迭代器取一條查詢結(jié)果。流式查詢的好處是能夠降低內(nèi)存使用
    2022-08-08
  • Scala常用List列表操作方法示例

    Scala常用List列表操作方法示例

    這篇文章主要介紹了Scala常用List列表操作方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • SpringBoot學習之基于注解的緩存

    SpringBoot學習之基于注解的緩存

    spring boot對緩存支持非常靈活,我們可以使用默認的EhCache,也可以整合第三方的框架,只需配置即可,下面這篇文章主要給大家介紹了關于SpringBoot學習之基于注解緩存的相關資料,需要的朋友可以參考下
    2022-03-03
  • Java實現(xiàn)圖片合成的示例詳解

    Java實現(xiàn)圖片合成的示例詳解

    前端有一個神器——canvas,這個畫布標簽可以處理各種圖片的合成,可以精確到圖片的具體坐標。java后端也有這樣的神器,那就是image-combiner,可以很簡單的合成圖片,感興趣的可以試一試
    2022-01-01
  • SpringCloud實現(xiàn)灰度發(fā)布的方法步驟

    SpringCloud實現(xiàn)灰度發(fā)布的方法步驟

    本文主要介紹了SpringCloud實現(xiàn)灰度發(fā)布的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • Java中json處理工具JsonPath的使用教程

    Java中json處理工具JsonPath的使用教程

    JsonPath類似于XPath,是一種json數(shù)據(jù)結(jié)構節(jié)點定位和導航表達式語言,這篇文章主要為大家介紹了JsonPath的基本使用,需要的小伙伴可以參考下
    2023-08-08

最新評論