后台服务程序应用分析
一、背景介绍: 后台服务程序加载,主要应用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
参数格式及用法,参考前面背景介绍。 
|