這個問題也不能算是XXL-JOB的問題,而是Java的Runtime.getRuntime().exec()形成的,BufferedReader的緩衝區大小有限,當不能及時從緩衝區中把輸出取走,那麼緩衝區滿了以後就會致使程序阻塞;java
最簡單的方式就是將正常輸出和異常輸出使用兩個不一樣的線程進行操做spring
Process process = Runtime.getRuntime().exec(command); StreamOutter errorGobbler = new StreamOutter(process.getErrorStream(), "ERROR"); // any output? StreamOutter outputGobbler = new StreamOutter(process.getInputStream(), "OUTPUT"); // kick them off errorGobbler.start(); outputGobbler.start(); // command exit process.waitFor();
public class StreamOutter extends Thread { InputStream is; String type; public StreamOutter(InputStream is, String type) { this.is = is; this.type = type; } public void run() { System.out.println("進入" + type + "處理線程"); BufferedReader br = null; try { InputStreamReader isr = new InputStreamReader(is); br = new BufferedReader(isr); String line; System.out.println("開始處理" + type + "線程數據"); while ((line = br.readLine()) != null) { XxlJobLogger.log(line); } } catch (IOException ioe) { ioe.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
br = new BufferedReader(isr); int one = null; if((one=br.read()) != -1){ System.out.println((char) one); }
br.read()是挨個取出全部字符,因此須要進行對one進行拼接後在使用\n進行拆分,有點相似於,一次性讀出文件的全部內容的方式,須要本身進行處理後獲得行數據springboot
我這裏使用第一種方式已經沒有問題了,至於第二種方式則須要自行探索了,若是有使用第二中方式解決的同窗,能夠指點一二;dom
java -jar xxx.jar aaa bbb ccccthis
傳了3個參數,分別是aaa,bbb,ccc命令行
經過main方法的參數獲取線程
java -jar xxx.jar --test.test=aaa --domain=bbbcode
是springboot的寫法,能夠經過@Value("${test.test}")@Value("${domain}") 獲取get
我的博客 蝸牛博客