使用Apache Common Daemon实现Windows服务
本文介紹使用Apcahe Common Daemon組件將java程序注冊為Windows服務的方法,同樣使用這個庫來實現服務的有著名的Tomcat,甚至我認為這個項目就是從Tomcat里剝出來的,理由很簡單,他們的ICON是一樣的。
Apcahe Common Daemon組件包含一個jar文件,兩個exe文件。其實這么說是不對的,其實Apcahe Common Daemon組件僅僅只包含一個jar文件,而配合在windows上啟動jar的是另一個項目,叫prorun。它僅僅負責在windows上啟動jar而在UNIX類OS上有別的工具來完成。
廢話不多說,從Apache網站上下載commons-daemon-1.1.0.jar文件,當然你可以是使用maven。添加到項目后,像下面代碼一樣創建一個實現了Daemon接口的啟動類,請忽略自動實現的destroy函數和init函數,在windows平臺上,這兩個函數不會被調用。而請重點關注startService和stopService兩個函數,這是我們公開給外部調用工具prorun的靜態接口,我們的程序會從這兩個函數進出。
public class ServiceLauncher implements Daemon {private static ServiceLauncher launcher;private Service service;@Overridepublic void destroy() {}@Overridepublic void init(DaemonContext arg0) throws DaemonInitException, Exception {}@Overridepublic void start() throws Exception {service = new Service();Thread t = new Thread(service);t.setDaemon(true);t.start();t.join();}@Overridepublic void stop() throws Exception {service.finish();}public static void startService(String[] args) {launcher = new ServiceLauncher(args);launcher.start();}public static void stopService(String[] args) { launcher.stop();} }這段代碼啟動了一個子線程,名字叫service,啟動它以后會等待,直到它自己退出。因為外部的執行工具prorun會隨時調用stopService來結束服務,所以實際上真正執行任務的service線程和當前的這個線程是被控制者和控制者的關系。也不要輕易的使用kill來殺死service線程,這會導致正在實行的任務中途退出,這不是一個優雅的設計。
至于service線程里的工作屬于項目范疇,不做介紹。現在介紹如何使用外部工具來啟動這個服務。
首先你得下載prcrun程序包,例如:commons-daemon-1.1.0-bin-windows.zip,解壓它會得到兩個可執行程序prunsrv.exe和prunmgr.exe,以及一個amd64版本的prunsrv.exe,它應該是64位版本的意思。請注意,如果你使用了32位版本的prunsrv.exe的話,那么你的jvm也必須是32位的,否則無法運行。
得到這兩個程序后再將剛才我們寫的java程序打包導出位一個可執行jar包,我們假設它叫program.jar,然后和剛才得到的兩個程序放在同一個文件夾下。接下來請把prunsrv.exe改名為program.exe,把prunmgr.exe改名為proguramw.exe。你問我為啥要改名?因為我高興。
?接下來我們需要注冊這個jar到windows服務管理器里了,請寫一個BAT文件:
@echo offset EXEC_DIR=%~dp0 set INSTALL_PATH=%EXEC_DIR%program.exe set JVM_PATH=%EXEC_DIR%\jre\bin\client\jvm.dll%INSTALL_PATH% //IS//<Service Name> --DisplayName="XXX" --Description="XXX" ^ --Install=%INSTALL_PATH% --Startup=manual --Jvm=%JVM_PATH% ^ --StartMode=jvm --StopMode=jvm ^ --Classpath=%EXEC_DIR%\lib\*;%EXEC_DIR%\* ^ --StartClass=xx.ServiceLauncher --StartParams=%EXEC_DIR% --StartMethod=startService ^ --StopClass=xx.ServiceLauncher --StopMethod=stopService ^ --LogPath=%EXEC_DIR%\logs --LogPrefix=Service --LogLevel=DEBUG --StdOutput=auto --StdError=autoif "%errorlevel%" == "0" ( echo Success ) else (echo Failed to install Windows Service ) @echo on在這個BAT里,我們使用program.exe來注冊這個jar文件到windows服務管理器里,參數比較多,但是其實管用的主要有這幾個:
//IS//<Service Name> 服務名
它會顯示在Windows服務管理器中,這是操作服務的唯一的句柄,啟動關閉都靠這個名字。
--Startup=manual 啟動方式,這是手動,自動是auto
--Jvm=%JVM_PATH% JVM的路徑,我們需要jvm.dll
--StartClass=xx.ServiceLauncher --StartParams=%EXEC_DIR% --StartMethod=startService? 啟動目標包和目標函數,以及傳遞給這個函數的參數。
--StopClass=xx.ServiceLauncher? --StopMethod=stopService 這是關閉時入口的設置
其他的就不重要了,自己理解吧。但是如何啟動這個服務呢,可以到windows服務管理器里手動啟動,也可以雙擊剛才改名的proguramw.exe,它會自動在windows里去找和自己名字一樣的widnwos服務,然后彈出界面,你只需要操作界面就可以啟動和關閉這個服務了。你也可以使用命令行來操作proguramw.exe啟動這個服務,它可以讓你把自己隱藏到托盤區域等等。
?
轉載于:https://www.cnblogs.com/mubawa/p/9560520.html
總結
以上是生活随笔為你收集整理的使用Apache Common Daemon实现Windows服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试面试的基础题目
- 下一篇: java信息管理系统总结_java实现科