首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

判斷 Apache Wrapper Service 註冊的 Java 服務是否已啟動:Socket 探活法

     編輯:Java 相關知識

背景痛點

使用 Apache Commons Daemon (jsvc/Wrapper) 將 Java 程序註冊為系統服務時,若配置 wrapper.ignore_signals=true(屏蔽 Ctrl+C、關閉窗口等信號防止誤停止),Wrapper 提供的 API 無法可靠判斷服務是否真正啟動完成(僅能反映進程存在)。

原理解析

Wrapper 通過 Socket 與 JVM 通信(默認隨機端口,建議在 wrapper.conf 指定固定端口如 wrapper.port=3976)。JVM 啟動成功後會綁定該端口並保持長連接心跳。因此,本地 Socket 連通性即等價於服務已就緒。

Java 探活代碼實現

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());
}

關鍵配置提醒

  1. 固定端口:wrapper.conf 中設置 wrapper.port=3976,避免隨機端口導致探活失敗。
  2. 防火牆:本機防火牆必須允許 localhost 該端口通信,否則誤判為未啟動。
  3. 超時設置:連接超時需大於服務最長啟動時間(含 JVM 預熱、應用初始化),建議 60-120 秒。
  4. 權限:探活程序與服務同用戶運行,或開放本地回環接口權限。

擴展:集成到啟動腳本/監控系統

  • Shell 腳本:nc -z 127.0.0.1 3976 或 timeout 60 bash -c \"until nc -z 127.0.0.1 3976; do sleep 1; done\"
  • 監控系統(Zabbix/Prometheus):TCP 端口可用性檢查 + 進程存在性雙重驗證。
  • 健康檢查端點:應用層再暴露 HTTP /health 接口,雙層保障。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved