Apache commons exec 簡介和簡單ping命令方法調用實現
Apache commonsexec提供一些常用的方法用來執行外部進程。Apache commons exec庫提供了監視狗Watchdog來設監視進程的執行超時,同時也還實現了同步和異步功能。
Apache commonsexec涉及到多線程,比如新啟動一個進程,Java中需要再開三個線程來處理進程的三個數據流,分別是標準輸入,標準輸出和錯誤輸出。
需要使用該功能需要引入commons-exec-1.3.jar包,目前最新的版本為1.3版本。
在日常工作和生活中,我們經常需要用到網絡,網絡有時候會出現不穩定的情況,這個時候我們可以用ping命令查看網絡情況,如果需要自動化檢測網絡,那么下面這個例子可以參考。
packagetest.ffm83.commons.exec;
importorg.apache.commons.exec.CommandLine;
importorg.apache.commons.exec.DefaultExecutor;
importorg.apache.commons.exec.PumpStreamHandler;
importorg.apache.commons.io.output.ByteArrayOutputStream;
/**
* 通過commons exec啟動ping命令來查看網絡情況
* @author 范芳銘
*/
public classEasyExecPing {
public static void main(String[] args){
EasyExecPing exec = newEasyExecPing();
exec.ping("127.0.0.1");
}
public void ping(String ip) {
String command = "ping" + ip;
try {
ByteArrayOutputStreamoutputStream = new ByteArrayOutputStream();
ByteArrayOutputStreamerrorStream = new ByteArrayOutputStream();
//命令行處理
CommandLinecommandline = CommandLine.parse(command);
//進行執行體
DefaultExecutor exec= new DefaultExecutor();
exec.setExitValues(null);
PumpStreamHandlerstreamHandler = new PumpStreamHandler(
outputStream,errorStream);
exec.setStreamHandler(streamHandler);
exec.execute(commandline);//執行
String out =outputStream.toString("gbk");
String error =errorStream.toString("gbk");
System.out.println(out);
System.err.println(error);
} catch (Exception e) {
e.printStackTrace();
}
}
}
運行情況如下:
正在 Ping 127.0.0.1 具有 32 字節的數據:
來自 127.0.0.1 的回復: 字節=32 時間<1msTTL=64
來自 127.0.0.1 的回復: 字節=32 時間<1msTTL=64
來自 127.0.0.1 的回復: 字節=32 時間<1msTTL=64
來自 127.0.0.1 的回復: 字節=32 時間<1msTTL=64
127.0.0.1 的 Ping 統計信息:
數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
最短 = 0ms,最長 = 0ms,平均 = 0ms
結果非常不錯。但是ping命令還有其他寫法,比如ping 127.0.0.1 –t ,這個表示一直查看。加到我們的程序中試一下。
我泡了一杯茶,看了下,程序還在執行;
召集了一次項目例會,會開完了,程序還在執行;
看下時間,從開始運行到現在已經過去了3小時。
一不小心就搞出了死循環了,趕緊想辦法吧。
開頭的地方提到,有監視狗Watchdog可以控制超時,我們試一下吧。
加入監控狗的ping代碼:
packagetest.ffm83.commons.exec;
importorg.apache.commons.exec.CommandLine;
importorg.apache.commons.exec.DefaultExecutor;
importorg.apache.commons.exec.ExecuteWatchdog;
importorg.apache.commons.exec.PumpStreamHandler;
importorg.apache.commons.io.output.ByteArrayOutputStream;
/**
* 通過commons exec啟動ping命令來查看網絡情況
* @author 范芳銘
*/
public classEasyExecPing {
public static void main(String[] args){
EasyExecPing exec = newEasyExecPing();
exec.ping("127.0.0.1-t");
}
public void ping(String ip) {
String command = "ping" + ip;
try {
ByteArrayOutputStreamoutputStream = new ByteArrayOutputStream();
ByteArrayOutputStreamerrorStream = new ByteArrayOutputStream();
//命令行處理
CommandLinecommandline = CommandLine.parse(command);
//進行執行體
DefaultExecutor exec= new DefaultExecutor();
exec.setExitValues(null);
//利用監視狗來設置超時
ExecuteWatchdogwatchdog = new ExecuteWatchdog(60000);
exec.setWatchdog(watchdog);
PumpStreamHandlerstreamHandler = new PumpStreamHandler(
outputStream,errorStream);
exec.setStreamHandler(streamHandler);
exec.execute(commandline);//執行
String out =outputStream.toString("gbk");
String error =errorStream.toString("gbk");
System.out.println(out);
System.err.println(error);
} catch (Exception e) {
e.printStackTrace();
}
}
}
運行結果如下:
正在 Ping 127.0.0.1 具有 32 字節的數據:
來自 127.0.0.1 的回復: 字節=32 時間<1msTTL=64
來自 127.0.0.1 的回復: 字節=32 時間<1msTTL=64
來自 127.0.0.1 的回復: 字節=32 時間<1msTTL=64
來自 127.0.0.1 的回復: 字節=32 時間<1msTTL=64
……