在我
以前的一篇文章中介紹了使用Apache Wrapper Service這個(gè)工具將Java程序注冊成操作系統(tǒng)的服務(wù),如果你采用”實(shí)現(xiàn)WrapperListener這個(gè)接口并結(jié)合wrapper.conf” 這種方式來啟動(dòng)服務(wù),而且在wrapper.conf配置文件中將wrapper.ignore_signals屬性設(shè)置為true,Wrapper Service提供的API是無法正確的判斷服務(wù)是否正常的啟動(dòng),因?yàn)閣rapper.ignore_signals屬性用來屏蔽操作系統(tǒng)的消息機(jī)制,比如在啟動(dòng)服務(wù)的命令行窗口按Ctrl+C或者關(guān)閉啟動(dòng)服務(wù)的命令行窗口的時(shí)候,服務(wù)也不會(huì)停止,這樣可以防止誤操作。
其實(shí)在Wrapper Service這個(gè)工具是通過Socket和JVM進(jìn)行通信(順便說一下,這樣服務(wù)能否正常啟動(dòng)可能會(huì)受到本機(jī)防火墻的影響,我碰到過這種情況),在Wrapper Service的配置文件中可以指定服務(wù)使用的端口(默認(rèn)為隨機(jī)選擇端口,這樣很不可靠),這樣的話可以通過Java的Socket來判斷服務(wù)是否可以正常的啟動(dòng).
比如我們的服務(wù)使用的端口是3976,判斷的Java代碼是:
/**
* 檢查服務(wù)器連接狀態(tài) 。
* @author vwpolo
* @return String
*/
private String getWrapperServiceState() {
try {
InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1",3976);
Socket socket = new Socket();
socket.connect(socketAddress,60000);
return "已啟動(dòng)";
}catch (Exception e) {
return "已經(jīng)停止";
}
}
測試代碼:
System.out.println("服務(wù)啟動(dòng)狀態(tài): "+ getWrapperServiceState());