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隊列