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

將Java程序註冊為Windows系統服務:從JBuilder打包EXE到JavaService實踐

     編輯:Java 程式設計入門

問題背景:動態域名更新需後台常駐

ADSL動態IP需綁定3322域名,但其Windows客戶端非系統服務,無用戶登錄不運行。嘗試Windows Resource Kit Tools(instsrv+srvany)將普通程序註冊為服務,但CN99客戶端註冊後無法啟動。決定自行開發Java版動態DNS更新程序並註冊為系統服務。

Java程序變身Windows服務的探索

  1. JavaService (ObjectWeb Forge):嘗試多次均失敗,最終放棄。
  2. 自製方案:JBuilder打包EXE + instsrv/srvany
    • JBuilder將JAR打包為可執行EXE(實為啟動器)
    • instsrv ServiceName srvany.exe路徑 註冊服務
    • 服務管理器中設置啟動參數為自製EXE絕對路徑
    • 啟動服務成功運行

動態DNS更新核心代碼

package org.mstar.dns;

import java.util.TimerTask;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.logging.*;

public class Refresher {
    private static Log LOG = LogFactory.getLog(Refresher.class);

    public Refresher() {
        Timer timer = new Timer();
        timer.schedule(new RefreshTask(), 0, 60000); // 每60秒執行
    }

    class RefreshTask extends TimerTask {
        static final String URL = "https://members.3322.org/dyndns/update?system=dyndns&hostname=zjumty.3322.org";

        public void run() {
            HttpClient client = new HttpClient();
            GetMethod get = new GetMethod(URL);
            // 若需認證
            // client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("user", "pass"));
            try {
                int status = client.executeMethod(get);
                if (status == HttpStatus.SC_OK) {
                    String response = get.getResponseBodyAsString();
                    LOG.info("DNS更新響應: " + response);
                } else {
                    LOG.warn("DNS更新失敗,狀態碼: " + status);
                }
            } catch (Exception e) {
                LOG.error("DNS更新異常", e);
            } finally {
                get.releaseConnection();
            }
        }
    }

    public static void main(String[] args) {
        new Refresher(); // 啟動定時任務,主線程保持存活
        // 若作為服務運行,主線程不退出即可
    }
}

關鍵點總結

  • 定時任務用java.util.Timer+TimerTask,每60秒發起HTTP GET請求
  • 採用Apache Commons HttpClient處理HTTP通訊,釋放連接防洩漏
  • 日誌用Commons Logging,便於服務運行監控
  • JBuilder打包EXE時需包含所有依賴JAR(commons-httpclient、commons-logging、commons-codec等)
  • instsrv/srvany方案通用於任何可執行文件,無需Java原生服務支持

此法成功解決動態域名更新無人值守運行問題,為Java程序部署為Windows服務提供了通用可行路徑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved