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

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

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

下面是代碼的結構圖:

總結

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: