Java Service Wrapper簡介與使用
在實際開發過程中很多模塊需要獨立運行,他們並不會以web形式發布,傳統的做法是將其壓縮為jar包獨立運行,這種形式簡單易行也比較利於維護,但是 一旦服務器重啟或出現異常時,程序往往無法自行修復或重啟。解決服務器重啟的傳統做法是編寫一段shell腳本隨服務器啟動而運行,但是這樣做只是治標, 那么我們想尋求一種“治本”的方式該怎么辦呢?
Java Service Wrapper就輕松而簡單的為我們解決了這些問題。"Java Service Wrapper"顧名思義,將我們的Java程序包裝成系統服務,這樣就可以隨着系統的運行而自動運行,當然Java Service Wrapper(下面簡稱Wrapper)的功能絕不僅於此。
Wrapper下載地址:http://wrapper.tanukisoftware.com/doc/english/download.jsp
通過下載頁面我們可以看到Wrapper幾乎支持所有的系統環境,說明Wrapper在這方面還是很下工夫的,目前最新版本為3.5.20,我們選擇Linux x86版本下載,解壓后目錄組成如下圖所示:
為了更直觀的了解Wrapper的目錄及文件結構,可以通過"tree"命令列出Wrapper的所有文件樹,cmd控制台下輸入命令:
- tree /f
- 顯示目錄結構如下:
- wrapper-linux-x86.
- │ jdoc.tar.gz //javadoc文件
- │ README_de.txt //說明
- │ README_en.txt //說明
- │ README_es.txt //說明
- │ README_ja.txt //說明
- │
- ├─bin //執行文件目錄
- │ demoapp //示例程序
- │ testwrapper //測試程序
- │ ★wrapper //主程序(重要)
- │
- ├─conf //配置文件目錄
- │ demoapp.conf //示例配置文件
- │ ★wrapper.conf //主配置文件(重要,文件名可修改)
- │
- ├─doc //說明文檔目錄
- │ index.html //首頁
- │ revisions.txt //版本說明
- │ wrapper-community-license-1.1.txt //許可協議
- │
- ├─jdoc //javadoc文檔目錄
- │ index.html //首頁
- │
- ├─lib //依賴類庫目錄
- │ ★libwrapper.so //wrapper linux文件(.so:用戶層的動態庫)
- │ ★wrapper.jar //wrapper主程序(重要)
- │ wrapperdemo.jar //示例程序
- │ wrappertest.jar //測試程序
- │
- ├─logs //日志目錄
- │ wrapper.log //日志文件
- │
- └─src //源代碼目錄
- ├─bin //執行程序目錄
- │ ★sh.script.in //shell腳本源代碼(重要)
- └─conf //配置目錄
- wrapper.conf.in //原始配置
以下是官方給出的一些Wrapper的優點:
(1) 使用我們的產品無須在你的程序中添加任何額外的代碼。
(2) 當你的程序或JVM出現問題時會自動響應事先定制的策略。
(3) 當出現問題時會及時進行通知。
(4) 完善的日志記錄功能可以更好為您提供支持。
(5) 在不同的系統上你可以指定一個標准的流程相同流程,也就是說相同的程序可以不必修改即運行於不同系統。
(6) 可以將你的應用安裝成windows或unix的服務或守護進程。
看到Wrapper有這么多好處,那么我們就通過Wrapper自帶的示例程序來進一步了解Wrapper吧:
1.創建服務工作目錄,以操作系統為Linux,目錄結構為usr/local/wrapper為例,按照上面的目錄結構,在其下創建"bin","conf","lib","logs"這四個相同名稱的文件夾。
2.將配置及程序文件復制至相應目錄(也就是上面標★的文件);
(1)bin 目錄下的wrapper 文件復制到usr/local/wrapper/bin下。
(2)src\bin 目錄下的sh.script.in 文件復制到usr/local/wrapper/bin下,並將.in后綴名刪除並修改名稱,修改后為javaService.script。
(3)conf 目錄下的wrapper.conf 文件復制到usr/local/wrapper/conf下。
(4)lib 目錄下的wrapper.jar 和libwrapper.so 文件復制到usr/local/wrapper/lib下。
注:以上是正式環境所需文件的配置方式,這里我們需要運行Wrapper自帶的demo程序,所以需要將demoapp,demoapp.conf,wrapperdemo.jar 這三個文件復制到相應目錄。
3.進入bin目錄執行以下命令:
- ./demoapp start
接下來會顯示很多提示,最終顯示如下頁面:
出現此頁面證明你的程序已經運行成功了,恭喜!
如果啟動失敗,我們可以查看logs日志內容,如下:
- STATUS | wrapper | 2013/07/30 11:22:47 | --> Wrapper Started as Daemon
- STATUS | wrapper | 2013/07/30 11:22:47 | Java Service Wrapper Community Edition 64-bit 3.5.20
- STATUS | wrapper | 2013/07/30 11:22:47 | Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.
- STATUS | wrapper | 2013/07/30 11:22:47 | http://wrapper.tanukisoftware.com
- STATUS | wrapper | 2013/07/30 11:22:47 |
- STATUS | wrapper | 2013/07/30 11:22:47 | Launching a JVM...
- INFO | jvm 1 | 2013/07/30 11:22:47 | WrapperManager: Initializing...
- INFO | jvm 1 | 2013/07/30 11:22:47 | DemoApp: Initializing...
- INFO | jvm 1 | 2013/07/30 11:22:47 | Demo: start()
- INFO | jvm 1 | 2013/07/30 11:22:47 | Demo: Showing dialog...
- INFO | jvm 1 | 2013/07/30 11:22:47 | Demo:
- INFO | jvm 1 | 2013/07/30 11:22:47 | Demo: ERROR - Unable to display the GUI:
- INFO | jvm 1 | 2013/07/30 11:22:47 | Demo: java.awt.HeadlessException:
- INFO | jvm 1 | 2013/07/30 11:22:47 | No X11 DISPLAY variable was set, but this program performed an operation which requires it.
- INFO | jvm 1 | 2013/07/30 11:22:47 | Demo:
- INFO | jvm 1 | 2013/07/30 11:22:47 | Demo: This demo requires a display to show its GUI. Exiting...
- INFO | jvm 1 | 2013/07/30 11:22:48 | Demo: stop(0)
- STATUS | wrapper | 2013/07/30 11:22:49 | <-- Wrapper Stopped
從日志內容可以查看程序及服務的運行狀態,Wrapper日志采用此種格式:類型 | 擁有者 | 時間 | 具體內容
日志內容顯示我們的Linux系統沒有安裝圖形界面或者根本沒有顯卡。
注:這里需要說明一下,Wrapper運行首先需要Java運行環境支持,所以在使用Wrapper前請先確認已安裝好了Java
下面我們來嘗試一下無參數調用服務的方式,如:
- ./testwrapper
- ./demoapp
兩者的提示相同,都為:
- Usage: ./程序 名 [ console {JavaAppArgs} | start {JavaAppArgs} | stop | restart {JavaAppArgs} | condrestart {JavaAppArgs} | status | install | remove | dump ]
- Commands:
- console Launch in the current console.
- start Start in the background as a daemon process.
- stop Stop if running as a daemon or in another console.
- restart Stop if running and then start.
- condrestart Restart only if already running.
- status Query the current status.
- install Install to start automatically when system boots.
- remove Uninstall.
- dump Request a Java thread dump if running.
- JavaAppArgs: Zero or more arguments which will be passed to the Java application.
原來Wrapper提供了很多種參數的選擇,如:start為啟動,stop為停止。下面為參數的詳細解釋:
- Commands:
- console 啟動並顯示控制台信息
- start 作為一個守護進程后台啟動
- stop 停止程序
- restart 重啟程序
- condrestart 重啟已經運行的程序,與前者區別是程序必須已經在運行
- status 查看該程序狀態
- install 將程序安裝為自啟動服務,即隨系統啟動而啟動
- remove 卸載自啟動服務
- dump 報告運行時的Java thread dump(thread dump百度百科:http://baike.baidu.com/view/5111187.htm)
我們還發現單獨運行wrapper命令時的提示內容與前面兩者不同,如下所示:
- Java Service Wrapper Community Edition 64-bit 3.5.20
- Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.
- http://wrapper.tanukisoftware.com
- Usage:
- ./wrapper <command> <configuration file> [configuration properties] [...]
- ./wrapper <configuration file> [configuration properties] [...]
- (<command> implicitly '-c')
- ./wrapper <command>
- (<configuration file> implicitly 'wrapper.conf')
- ./wrapper
- (<command> implicitly '-c' and <configuration file> 'wrapper.conf')
- where <command> can be one of:
- -c --console run as a Console application
- -v --version print the wrapper's version information.
- -? --help print this help message
- -- <args> mark the end of Wrapper arguments. All arguments after the
- '--' will be passed through unmodified to the java application.
- <configuration file> is the wrapper.conf to use. Name must be absolute or relative
- to the location of ./wrapper
- [configuration properties] are configuration name-value pairs which override values
- in wrapper.conf. For example:
- wrapper.debug=true
- Please note that any file references must be absolute or relative to the location
- of the Wrapper executable.
因為wrapper是Wrapper運行的主程序也是核心,他無法單獨運行需要通過src/bin中的sh.script.in這個shell腳本調用,這個文件的使用我們之后會講到。
運行wrapper可以按如上提示添加參數,如:./wrapper -c wrapper.properties
以上就是對Wrapper的一個整體認識,希望此文可以幫助大家更快的上手並使用Wrapper,之后幾篇文章會詳細講解Wrapper的配置及定制自己的應用。