溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

springboot怎么開啟一個(gè)監(jiān)聽線程執(zhí)行任務(wù)

發(fā)布時(shí)間:2023-02-28 16:16:27 來源:億速云 閱讀:76 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“springboot怎么開啟一個(gè)監(jiān)聽線程執(zhí)行任務(wù)”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“springboot怎么開啟一個(gè)監(jiān)聽線程執(zhí)行任務(wù)”文章能幫助大家解決問題。

    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);
    }

    springboot中監(jiān)聽事件的創(chuàng)建流程

    事件監(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)圖:

    springboot怎么開啟一個(gè)監(jiān)聽線程執(zhí)行任務(wù)

    關(guān)于“springboot怎么開啟一個(gè)監(jiān)聽線程執(zhí)行任務(wù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。

    向AI問一下細(xì)節(jié)

    免責(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)容。

    AI