首頁 > 軟體

springboot如何開啟一個監聽執行緒執行任務

2023-02-28 18:00:15

springboot開啟一個監聽執行緒執行任務

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中監聽事件的建立流程

事件監聽有同步和非同步兩種方式,springboot專案中提供了一個用於非同步處理的註解:@Async。

事件的大體步驟

  • 1:定義一個事件。
  • 2:  建立一個監聽器。
  • 3:確保監聽器在容器內。
  • 4:釋出事件,進行測試。

廢話不多說,簡單敘述幾個不同方式的demo。

首先,我們先建立一個springboot專案。

第一種

1:定義一個事件,需要繼承ApplicationEvent

public class MyEvent extends ApplicationEvent {
    public MyEvent(Object source) {
        super(source);
        System.out.println("我是一個事件,目前在事件的構造器內");
    }
}

2:建立一個監聽器。直接實現ApplicationListener介面,重寫其中onApplicationEvent方法.

public class MyEventListener implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent event) {
        System.out.println("現在開始執行監聽器中的內容,我是直接實現ApplicationListener介面的方式進行的");
        System.out.println("event.getSource() = " + event.getSource());
    }
}

3:將監聽器手動新增進應用容器內,並進行釋出事件。

@SpringBootApplication
public class EventTestApplication {
    public static void main(String[] args) {
//        SpringApplication.run(EventTestApplication.class, args);
        //第一種:自己手動將監聽器新增到application中
        SpringApplication application = new SpringApplication(EventTestApplication.class);
        //新增監聽器
        application.addListeners(new MyEventListener());
        ConfigurableApplicationContext context = application.run(args);
        //進行釋出事件
        context.publishEvent(new MyEvent("Event資料來源"));
        context.close();
    }
}

4:啟動主啟動類,進行列印測試。

第二種

1:同第一種的1

2:建立一個監聽器。

/**
 *第二種:打上Compoent註解,  將事件監聽器自動加入到應用容器中
 * 這種方式不需要手動加入到容器中。
 * */
@Component
public class MyEventListener2 implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent event) {
        System.out.println("現在開始執行監聽器中的內容,我是打Compoent註解的方式進行的");
        System.out.println("event.getSource() = " + event.getSource());
    }
}

3:釋出事件,後續進行啟動類測試即可。

@SpringBootApplication
public class EventTestApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(EventTestApplication.class, args);
        //釋出事件
        context.publishEvent(new MyEvent("source"));
        context.close();
    }
}

第三種

全部採用註解的方式

1:同第一種的1

2:建立一個監聽器。

/**
 *第三種:採用@EventListener註解的方式,不需要在類上實現ApplicationListener介面。
 * 直接採用的是通過註解,將方法標識為一個監聽器。
 * */
@Component
public class MyEventListener3 {
    @Async//非同步註解。開啟一個新執行緒。 去掉此註解則會變成同步監聽。
    @EventListener(classes = MyEvent.class)
    public void TestListener(MyEvent myEvent){
        System.out.println("我是@EventListener註解的方式實現的監聽器");
        System.out.println("myEvent.getSource() = " + myEvent.getSource());
    }
}

3:釋出事件,後續進行啟動類測試即可。

@SpringBootApplication
public class EventTestApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(EventTestApplication.class, args);
        //釋出事件
        context.publishEvent(new MyEvent("source"));
        context.close();
    }
}

以上就是三種建立的方式。

下面是程式碼的結構圖:

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com