使用 Apache Commons Daemon (jsvc/Wrapper) 將 Java 程序註冊為系統服務時,若配置 wrapper.ignore_signals=true(屏蔽 Ctrl+C、關閉窗口等信號防止誤停止),Wrapper 提供的 API 無法可靠判斷服務是否真正啟動完成(僅能反映進程存在)。
Wrapper 通過 Socket 與 JVM 通信(默認隨機端口,建議在 wrapper.conf 指定固定端口如 wrapper.port=3976)。JVM 啟動成功後會綁定該端口並保持長連接心跳。因此,本地 Socket 連通性即等價於服務已就緒。
import java.net.InetSocketAddress;
import java.net.Socket;
/**
* 檢查 Wrapper Service 是否已啟動就緒
* @return "已啟動" 或 "已經停止"
*/
public String getWrapperServiceState() {
try {
// 連接本地 Wrapper 通信端口,超時 60 秒
InetSocketAddress addr = new InetSocketAddress("127.0.0.1", 3976);
Socket socket = new Socket();
socket.connect(addr, 60_000); // 60s 連接超時,覆蓋啟動過程
socket.close();
return "已啟動";
} catch (Exception e) {
// 連接拒絕、超時、網絡不可達均視為未啟動
return "已經停止";
}
}
// 測試調用
public static void main(String[] args) {
System.out.println("服務啟動狀態: " + new WrapperChecker().getWrapperServiceState());
}
wrapper.conf 中設置 wrapper.port=3976,避免隨機端口導致探活失敗。nc -z 127.0.0.1 3976 或 timeout 60 bash -c \"until nc -z 127.0.0.1 3976; do sleep 1; done\"