Spring Boot CommandLineRunner的使用

1. 說明java

  程序在啓動完成的時候須要去處理某些業務,所以Spring Boot程序中須要去實現CommandLineRunner接口。
git

2. CommandLineRunner方法執行順序github

  程序啓動後,會執行接口重寫的run方法,若是有多個Service的話,執行是有順序的,能夠在類上添加Order註解,來制定該run方法的執行順序,Order中value的值越小,執行的順序越靠前。ide

@Order(value = 200)
@Service
public class CatService implements CommandLineRunner 

 3. 重寫run方法中使用了阻塞程序測試

  若是程序啓動後,咱們要執行一個阻塞程序,例如程序啓動後我要從阻塞隊列取數據,取到數據後完成個人業務邏輯,通常這樣的邏輯會寫成while(true),一直去取數據處理數據,這樣就會致使程序會阻塞。固然run方法不會結束。這樣會帶來一個問題,若是我有多個這樣的業務邏輯操做,只會執行Order中value最小的那一個,其餘的不會執行,由於這個執行是順序執行,前面的阻塞了,後面的就不會被執行到。spa

4. 線程池使用線程

  爲解決多個Service啓動後執行,而且須要阻塞執行的問題,須要在run方法中使用線程池解決。blog

 

@Order(value = 200)
@Service
public class CatService implements CommandLineRunner {

    private static Logger logger = LoggerFactory.getLogger(CatService.class);

    private static ExecutorService singlePool = Executors.newSingleThreadExecutor();

    @Override
    public void run(String... args) throws Exception {
        singlePool.execute(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    logger.info("cat:" + Stream.of(args).collect(Collectors.joining("-")));

                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
}

 

 

5. 測試代碼接口

  https://github.com/liuzwei/commandline.git隊列

相關文章
相關標籤/搜索