A-A+
使用JavaService创建Windows服务-创建Windows服务
目录索引:
使用JavaService创建Windows服务-IDEA下创建Jar包
使用JavaService创建Windows服务-创建Windows服务
在上一张创建完毕了可执行的Jar包后,接下来就是将其作为Windows服务运行起来,我们上一篇中创建的Jar包所在文件夹结构为:
其中lib和dataextract.jar是我们的Java程序,JavaService.exe就是我们用来将Java程序安装成Windows服务的辅助工具。JavaService.exe可以去http://forge.ow2.org/projects/javaservice/下载,如下图所示:
千万要注意操作系统的不同,32位需要使用JavaService-2.0.10.zip,而64位系统需要使用JavaService-2.0.10-amd64.zip,如果使用的不正确,虽然可以安装成Windows服务,但是会报错(找不到Win32程序入口)。
以上工作完成后,使用管理员身份打开Cmd命令行窗口,将路径转到Jar包所在的文件夹,运行命令:
- JavaService.exe -install DATA_EXTRACT "%JAVA_HOME%"/jre/bin/server/jvm.dll -Xmx256m -Djava.class.path="%JAVA_HOME%"/lib/tools.jar;C:/dataextract/out/dataextract.jar -start com.dataextract.app.Run -method StartService -stop comdataextract.app.Run -method StopService -auto
其中,DATA_EXTRACT为Windows服务名称;使用%JAVA_HOME%是为了避免路径中存在空格;需要确保系统环境变量中有%JAVA_HOME%存在;C:/dataextract/out/为Jar包所在的文件夹路径;com.dataextract.app是我们的入口程序所在的包名;StartServic为启动函数;StopService为停止函数;-auto为Windows服务使用自启动方式。
com.dataextract.app.Run这个类的代码如下:
- public class Run {
- private static Thread thread=null;
- private static Service service = null;
- /**
- * 退出服务方法(该方法必须有参数 String [] args)
- * @param args
- */
- public static void StopService(String[] args)
- {
- service.setRunFlag(false);
- }
- /**
- * 启动服务方法(该方法必须有参数 String [] args)
- * @param args
- */
- public static void StartService(String[] args)
- {
- // 产生服务线程
- service = new Service();
- thread=new Thread(service);
- try
- {
- // 将服务线程设定为用户线程,以避免StartService方法结束后线程退出
- thread.setDaemon(false);
- if(!thread.isDaemon()) {
- log.info("用户线程已成功设定");
- }
- //启动服务线程
- thread.start();
- }
- catch(Exception e)
- {
- }
- }
- }
- class Service implements Runnable{
- private boolean runFlag = true;
- /**
- * 设定服务线程运行标志值
- */
- public synchronized void setRunFlag(boolean runFlag) {
- this.runFlag = runFlag;
- }
- /**
- * 取得服务线程运行标志值
- */
- private synchronized boolean getRunFlag() {
- return runFlag;
- }
- public void run() {
- log.info("服务启动于" + DateUtil.now());
- while(getRunFlag()) {
- try{
- //运行代码
- Thread.sleep(100000*10);
- }
- catch (Exception e) {
- log.error(e);
- }
- }
- log.info("服务停止于" + DateUtil.now());
- }
- }