對於在 Java 平台上 , 部署過後台服務器的人來說 , 讓 Java 程式以 Windows/Linux 服務 (daemon) 形式執行 , 是一個常見的問題 , 這裡的以 “ 服務方式 ” 是指該程式會隨系統啓動而自動執行 , 甚至更好的話 , 該程式如果異常結束會被重新執行 。 過去 , 山姆鍋跟多數的人一樣 , 選擇 Java Service Wrapper, 不過自從它在 3.2.3 版本以後改了授權 , 雖然仍可以繼續使用 3.2.3 版本 , 但相信很多人也跟我一樣想尋找其他替代方案 。

由於 「 影化身科技 」 的部署環境只在 Linux 系統 , 因此 , 本文著重在 Linux 系統上的解決方案 , 對於想要在 Windows 系統執行 Java 服務的人 , 您的選擇相對較少 。 底下針對幾個替代方案 , 山姆鍋整理了他們各自的優缺點供您參考 。

1. 使用 Shell script

這個方法基本上就是使用一個 init script( 通常位於 /etc/init.d/ 目錄 ) 來負責 Java 程式的啓動與終止 , 好一點的還可以查看 Java 程式是否在執行中 ( 但無法知道是否正常提供服務 )。 對於想要在 Unix-like 系統 , 像是 Linux, FreeBSD 等 , 執行 Java 服務的人 , 這是個簡單的方案 , 雖然少了監控 Java 服務在異常的情況下重新執行的功能 。

優點 :

  • 只需要一個 Shell script。
  • 適用大部份 Unix-like 系統 。
  • 也適用 Java 以外的程式 。

缺點 :

  • 缺少監控的功能 。
  • 不適用 Windows 系統 。

對於有其他行程 (process) 監控方法且只需在 Unix-like 系統上執行 Java 服務的人 , 建議採用這個方案 。

2. 使用 Shell script + Monit

對於想採用第一種方案 , 但又想有異常監控功能的人 , 可以採用這個方案 。 簡單地說 : 就是使用 Monit 來補足所欠缺的監控功能 。Monit 提供的監控功能明顯比 Java service wrapper 多 。

優點 :

  • 具備方案 1 的所有優點 。
  • 擁有完整的監控與警告功能 。

缺點 :

  • Monit 的設定並不直覺 。
  • 不適用 Windows 系統 。

對於只需要在 Unix-like 系統執行 Java 服務的人 , 建議採用這個方案 。

3. 使用 YAJSW

YAJSW 的目的一開始就是要取代 Java service wrapper, 這點從它的名稱 :”Yet Another Java Service Wrapper” 可以得知 。 跟 Java Service Wrapper 很大不同點在於 :YAJSW 採用 Java 與 Native 混合方式實作 , 不像 JSW 是 native 程式 。

優點 :

  • 支援多個平台 。
  • 可以使用 Groovy 客制化 。
  • 可以監控 Java 程式 , 必要時可以發出警告或重啓 。
  • 支援 Mac OS 的 Launchd。

缺點 :

  • 如果 JVM 的實作本身有問題 , 可能會跟被監控的程式一起發生故障 。
  • 耗用較多系統資源 。

對於同時需要在 Unix-like 系統外執行 Java 服務 , 或者需要客制化功能的人 , 建議採用此方案 。

4. 使用其他工具

其他方案 , 像是 Jsvc, Procrun 等 , 都有它們各自的問題導致不符合需要 , 像 Procrun 只支援 Windows 系統 , 而 Jsvc 可能會要自行編譯 C 程式 。 雖然這些工具不符合 「 影化身科技 」 的需求 , 但提出來供符合需要人參考 。

小結

在目前階段 , 對於要讓 Java 程式以服務形式執行又不想使用 Java service wrapper 的人 , 如果看了上面的介紹還是不清楚哪個方案適合您 , 山姆鍋統一推薦方案 3: YAJSW。 但請注意 :「 影化身科技 」 採用的是方案 2, 也就是 Shell script + Monit! 因為 , 本文一開始就強調 :「 影化身科技 」 只需要在 Linux 系統上部署 Java 服務 。