後臺服務程序應用分析
一、背景介紹:
後臺服務程序加載,主要應用service.exe程序,將程序加載到WINNT的啓動服務中。
啓動服務加載形式,在TOMCAT和JRUN已經有應用,下面以TOMCAT爲例子,簡單介紹一下實現原理及過程:
service.exe:原名是javaService.exe,現在爲了說明需要,將其改名爲:service.exe。
該想法模擬大多數JAVA應用程序在WINDOWS系統中創建開機啓動服務。(當然其它語言編譯的程序同樣也可以加載,現以TOMCAT服務器爲例來作說明,TOMCAT作爲一個開源軟件,方便借鑑其設計思想)
1,copy service.exe到所要啓動的JAVA應用程序目錄中;
2,建立一個.bat文件,文件內容用格式如下:
service.exe -install "mediaService" C:/jdk1.3.0_02/jre/bin/classic/jvm.dll -Djava.class.path=C:/app/authsvr/media/auth.jar -Dcatalina.home=C:/app/authsvr/media/ -start C:/app/authsvr/media/auth.jar -params star -stop C:/app/authsvr/media/auth.jar -params stop -out C:/app/authsvr/media/stdout.log -err C:/app/authsvr/media/stderr.log
C:/jdk1.3.0_02/bin/java.exe -jar -Duser.dir="C:/Program Files/Apache Tomcat 4.0" "C:/Program Files/Apache Tomcat 4.0/bin/bootstrap.jar" start
C:/jdk1.3.0_02/bin/java.exe -jar -Duser.dir="C:/Program Files/Apache Tomcat 4.0" "C:/Program Files/Apache Tomcat 4.0/bin/bootstrap.jar" stop
//後面的是TOMCAT的例子,tomcat.exe是類似於service.exe的程序,採用C編寫一個共享小程序,在很多地方可以下載或者複製。
//改爲tomcat.exe or service.exe只是爲了使用的時候,更容易理解其功能。
//在命令提示符下,可以service.exe /? 可以查到其相應可用參數。
@ tomcat.exe -install Tomcat
@ {JDK_HOME}/jre/bin/{hotspot|server|classic}/jvm.dll
@ -Djava.class.path={TOMCAT_HOME}/bin/bootstrap.jar;{TOMCAT_HOME}/bin/servlet.jar;{JDK_HOME}/lib/tools.jar
@ -Dcatalina.home={TOMCAT_HOME}
@ -start org.apache.catalina.startup.BootstrapService
@ -params start
@ -stop org.apache.catalina.startup.BootstrapService
@ -params stop
@ -out {TOMCAT_HOME}/logs/stdout.log
@ -err {TOMCAT_HOME}/logs/stderr.log
3,參數說明:
To install a service:
-install service_name jvm_library (jvm_option)*
-start start_class [-method start_method] [-params (start_parameter)+]
[-stop start_class [-method stop_method] [-params (stop_parameter)+]]
[-out out_log_file] [-err err_log_file]
[-current current_dir]
[-path extra_path]
4,分析tomcat自動加載服務模式
@ {JDK_HOME}/jre/bin/{hotspot|server|classic}/jvm.dll //jre,jvm
@ -Djava.class.path={TOMCAT_HOME}/bin/bootstrap.jar;{TOMCAT_HOME}/bin/servlet.jar;{JDK_HOME}/lib/tools.jar //*.jar
@ -Dcatalina.home={TOMCAT_HOME} //path
start:
C:/jdk1.3.0_02/bin/java.exe -jar -Duser.dir="C:/Program Files/Apache Tomcat 4.0" "C:/Program Files/Apache Tomcat 4.0/bin/bootstrap.jar" start
相應加載語句爲:
@ -start org.apache.catalina.startup.BootstrapService
@ -params start
stop:
C:/jdk1.3.0_02/bin/java.exe -jar -Duser.dir="C:/Program Files/Apache Tomcat 4.0" "C:/Program Files/Apache Tomcat 4.0/bin/bootstrap.jar" stop
相應加載語句爲:
@ -stop org.apache.catalina.startup.BootstrapService
@ -params stop
下面是指定捕捉相應的標準事件和錯誤事件的輸出到相應的記錄文件當中:
@ -out {TOMCAT_HOME}/logs/stdout.log
@ -err {TOMCAT_HOME}/logs/stderr.log
5,接下來的任務就是要將認證啓動的線程,做成類似 org.apache.catalina.startup.BootstrapService.java 相應的能接受start or stop 相應參數的類,或者是提供等同功能的其它方法。
BootstrapService.java等相關文件於該文件一起附於壓縮包內。
二、實現步驟:
1,tomcat啓動實現,主要是應用Daemon接口,所以同樣建立com.lulu.app.daemon.Daemon接口
package com.lulu.app.daemon;
// Referenced classes of package com.lulu.app.daemon:
// DaemonContext
public interface Daemon
{
public abstract void init(DaemonContext daemoncontext)
throws Exception;
public abstract void start()
throws Exception;
public abstract void stop()
throws Exception;
public abstract void destroy();
}
2,然後在啓動程序BootstrapService.java中實現daemon接口(implements Daemon)
以program應用爲例,需要將pgmAutoUpdate.java進行改造,實現daemon接口,
// -------------------------------------------------------- Service Methods
/**
* Load the App Service.
*/
public void init(DaemonContext context) throws Exception
{
String arguments[] = null;
/* Read the arguments from the Daemon context */
if (context!=null)
{
arguments = context.getArguments();
if (arguments!=null)
{
for (int i = 0; i < arguments.length; i++)
{
if (arguments[i].equals("-debug"))
{
debug = 1;
}
}
}
}
if(!boolNoReadKey)
{
rk = new readKey();
rk.start();
}
log("Create App APP server");
}
/**
* Start the App Service.
*/
public void start() throws Exception
{
System.out.println("test start is ok:");
// for(int i=0;;i++)
for(;;)
{
try
{
if (!stopFlag)
{
// System.out.println("test times:"+i);
pgmUpdate = new PgmUpdate();
pgmUpdate.start();
pgmUpdate.join();
}
else
System.exit(1);
}
catch(Exception ex)
{
System.out.println(ex.getMessage());
}
try
{
Thread.sleep(1000);
}
catch(InterruptedException ex)
{
System.out.println(ex.getMessage());
}
}
}
/**
* Stop the App Service.
*/
public void stop() throws Exception
{
System.out.println("test stop is ok:");
stopFlag = true;
}
/**
* Destroy the App Service.
*/
public void destroy()
{
// FIXME
}
3,將編譯好的進行打包,
打包命令:
rem @echo off
rem 產生jar文件
jar cvfm ../bin/service.jar MANIFEST.MF -C ../classes .
rem jar文件打包結束
其中MANIFEST.MF文件內容如下:
Manifest-Version: 1.0
Created-By: sun jar
Main-Class: com.lulu.app.program.BootstrapService
Class-Path:
Specification-Title: APP Service
Specification-Version: 1.0
Created-By:
4,運用service.exe,加載到NT的服務啓動中。
service.bat內容如下:
service.exe -install appService C:/jdk1.3.1_03/jre/bin/hotspot/jvm.dll -Xmx512m -Xms128m -Djava.class.path=D:/app/Application/program/bin/program.jar;/lib/tools.jar
-start com.lulu.app.program.BootstrapService -params start C:/jdk1.3.1_03
-stop com.lulu.app.program.BootstrapService -params stop
-out D:/biwm/app/Application/program/logs/stdout.log
-err D:/biwm/app/Application/program/logs/stderr.log
參數格式及用法,參考前面背景介紹。