访问 http://www.qqread.com/java/2008/02/h396353.html三、集成JNI和Windows服务API
为了演示Windows服务的功能,我在这设计了一h个叫Dummy的Java类。这个类在main方法等待一个停止事件。并实现了shutdown方法,在这个方法里设置并调用了stop事件。这将保证main线程安全地退出。在Dummy类中还实现了shutdown钩子,这个钩子主要给java.exe使用。Dummy.java的代码如下:
为了启动服务,我们需要使用StartServiceCtrlDispatcher来注册ServiceMain函数。这个ServiceMain函数包含了我们的主要功能。在我们的例子中,就是InvokeMain函数。接下来,调用RegisterServiceCtrlHandler(SERVICE_NAME, ServiceHandler);,这个函数注册一个Handler,并从SCM接收响应的命令。为了防止由于JVM崩溃而导致整个服务瘫痪,我们在另外一个线程里调用InvokeMain方法。上面的程序被写在DummyService.cpp中,通过VS2005将其编译成DummyService.exe。上面的代码可以通过点击此处下载
接下来我们使用如下的命令来安装、启动、停止以及卸载Windows服务:
上面的程序只是使用了最小的配置。其实要想充分使用JNI,得需要使用很多参数。一般需要至少15至20个配置参数。下面是在定制满足我们需要的程序的配置参数:
2. 和Java应用相关的参数:
3. 日志参数:
我们可以根据具体的要求选择使用哪些参数。我们可以将这些参数保存在被推荐的注册表的位置:HKLM\System\CurrentControlSet\[Service Name]\Parameters. 中。
更多内容请看Windows操作系统安装、Windows权限设置、Java环境安装配置专题,或进入讨论组讨论。
为了演示Windows服务的功能,我在这设计了一h个叫Dummy的Java类。这个类在main方法等待一个停止事件。并实现了shutdown方法,在这个方法里设置并调用了stop事件。这将保证main线程安全地退出。在Dummy类中还实现了shutdown钩子,这个钩子主要给java.exe使用。Dummy.java的代码如下:
import java.io.*; public class Dummy...{ public static Dummy xyz = null; private boolean stopped = false; public static PrintWriter pw; public Dummy() throws IOException ...{ pw = new PrintWriter(new OutputStreamWriter( new FileOutputStream("C:\\dummy.log")), true); } public void start() ...{ pw.println("started"); while(!stopped) ...{ synchronized(this) ...{ try ...{ wait(); } catch (InterruptedException ie) ...{} } } pw.println("stopped"); } public void stop() ...{ pw.println("stopping"); synchronized(this) ...{ stopped = true; notifyAll(); } try ...{ Thread.sleep(1000); } catch(Exception ex)...{} } public static void main(String[] args) ...{ try ...{ xyz = new Dummy(); Runtime.getRuntime().addShutdownHook(new Thread() ...{ public void run() ...{ pw.println("inside shutdown hook"); xyz.stop(); } }); xyz.start(); } catch (Exception ex) ...{} } public static void shutdown() ...{ xyz.stop(); } }
典型的Windows服务(除了设备驱动服务外)是由服务控制管理器(SCM,也就是众所周知的services.exe进程)按着服务进程创建和管理的。一个单独的进程包含有多个服务。但在本文的例子中一个服务进程只包含一个JVM实例服务。
我们可以使用如下的API在SCM中安装一个服务:
我们可以使用如下的API在SCM中安装一个服务:
SC_HANDLE schSCManager = OpenSCManager(..),
SC_MANAGER_CREATE_SERVICE);
SC_HANDLE schService = CreateService(..)
也可以使用如下的API来卸载Windows服务程序:
SC_HANDLE schSCManager = OpenSCManager(.., SERVICE_ALL_ACCESS);
SC_HANDLE schService = OpenService( schSCManager, ..);
DeleteService(schService)
为了启动服务,我们需要使用StartServiceCtrlDispatcher来注册ServiceMain函数。这个ServiceMain函数包含了我们的主要功能。在我们的例子中,就是InvokeMain函数。接下来,调用RegisterServiceCtrlHandler(SERVICE_NAME, ServiceHandler);,这个函数注册一个Handler,并从SCM接收响应的命令。为了防止由于JVM崩溃而导致整个服务瘫痪,我们在另外一个线程里调用InvokeMain方法。上面的程序被写在DummyService.cpp中,通过VS2005将其编译成DummyService.exe。上面的代码可以通过点击此处下载
接下来我们使用如下的命令来安装、启动、停止以及卸载Windows服务:
DummyService /i // 安装服务
net start DummyService // 启动服务
net stop DummyService // 停止服务
DummyService /u // 卸载服务
上面的程序只是使用了最小的配置。其实要想充分使用JNI,得需要使用很多参数。一般需要至少15至20个配置参数。下面是在定制满足我们需要的程序的配置参数:
1. Windows服务参数:
(1) 服务名
(2) 演示名
(3) 描述
(4) 执行路径
(4) 执行路径
(5) 启动类型(自动/手动)
(6) 在注册中被保存的参数
(7) 工作目录
(7) 工作目录
(8) 存在于每个进程的服务或在单进程中的许多服务
(9) 和桌面交互的选项(如果服务有一个UI接口)
(10) 登录用户名和密码(当使用用户帐号或本地系统帐号来运行服务时需要)
(9) 和桌面交互的选项(如果服务有一个UI接口)
(10) 登录用户名和密码(当使用用户帐号或本地系统帐号来运行服务时需要)
2. 和Java应用相关的参数:
(11) jvm.dll的路径
(12) JVM选项(-D, -X)
(13) 类名
(13) 类名
(14) 命令行参数
(15) 关闭超时
(15) 关闭超时
3. 日志参数:
(16) 事件日志和文件日志
(17) 用于重定向输入、输出的参数
我们可以根据具体的要求选择使用哪些参数。我们可以将这些参数保存在被推荐的注册表的位置:HKLM\System\CurrentControlSet\[Service Name]\Parameters. 中。
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- Windows操作系统安装 (15618篇文章)
- Windows权限设置 (10238篇文章)
- Java环境安装配置 (5640篇文章)
- Windows操作系统安全集 (18679篇文章)
- Java编程开发手册 (8291篇文章)
- Windows频道 (9812篇文章)
- 系统服务 (612篇文章)
- J2SE综合:浅谈java程序发布之 jre 篇 (11次浏览)
- JAVA代码中使用魔法数值 (8次浏览)
- Hibernate缓存管理 (6次浏览)
- JAVA代码应该流畅和结构化 (5次浏览)
- Java JVM设置对性能的影响 (4次浏览)
- 开发框架:深入了解 Struts Validator (3次浏览)
- Java中的通信机制及与C/C API的集成 (1次浏览)
- 用Hibernate实现领域对象的自定义字段 (1次浏览)
- Java语言入门 简述Java语言回收机制 (0次浏览)
- 2008年Java开发者最迫切的五个期望 (0次浏览)



