`
380071587
  • 浏览: 445933 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java编程:将Java程序注册成系统服务(NT服务)

 
阅读更多

来自:http://webservices.ctocio.com.cn/java/58/9072558.shtml 

你是不是在找将Java程序注册成系统服务的方法?试试Java Service Wrapper这个工具吧,你可以从这个网站上面下载你喜欢的版本:http://wrapper.tanukisoftware.org/ ,Java Service Wrapper提供了适合市面上流行的操作系统的版本。

  你是不是在找将Java程序注册成系统服务的方法?试试Java Service Wrapper这个工具吧,你可以从这个网站上面下载你喜欢的版本:http://wrapper.tanukisoftware.org/ ,Java Service Wrapper提供了适合市面上流行的操作系统的版本。

  使用Wrapper将Java程序注册成系统服务有三种方式可供选择:

  第一种是使用WrapperSimpleApp 这个帮助类来运行你的程序,这个是最简单的方法,也是官方推荐使用的方式,但是这样可能会对你的程序有改动,如果你在项目初期就开始考虑的话,这个方法还是不错的。像JBoss也是使用这种方式。

  第二种方式是使用WraperStartStopApp这个类来实现功能,这个方法适合那些通过ClassA类来负责启动服务,ClassB类来负责停止服务的应用场景。

  我使用的是第三种方式,这种方式好处是对程序改动比较小,只要让你的启动类实现WrapperListener接口,并实现接口中的start(String[] args) 和 stop(String [] args)方法,然后通过WrapperManager来启动。其他的一些配置比如要运行的主类全名、Java类路径、依赖Java库的路径、还有服务显示的名称,都可以通过配置文件conf/wrapper.conf来配置,相对来说比较灵活,像我目前在做的RCP项目有自动更新功能,更新下来的插件要比那些原来的插件的版本号要更新,虽然说会定期删除那些过期的插件,但有时还是会产生延迟,那么配置文件里面配置的Java类路径必须也要链接到最新的插件的地址,我是通过一个Java类来管理这个wrapper.confg文件,如果有更新的插件,通过Java类来得到最新插件的路径,将这些信息写入到wrapper.confg文件中,这样就能保证配置文件中的类路径是最新的了。

  下面是程序的结构

  

  这里主页介绍一下wrapper.conf的配置,这个配置文件是Java常用的属性文件格式,

  wrapper.java.command=java: 指定要运行的Java,如果你不想设置环境变量的话,你也可以指定JDK的bin文件路径

  wrapper.java.mainclass=test.Main: 指定要运行的类,这个类必须实现WrapperListener接口和接口中的start和stop方法,通过WrapperManager类来初始化服务。如果启动服务过程中出现与不能取得JVM信息的情况,可能是接口实现的问题。

  wrapper.java.classpath.1=……/lib/wrapper.jar:配置Java的类路径,这里的将wrapper.jar也包含在内,这里可以设置参数的位置,而且这个位置必须得从1 开始,不能跳过,必须顺序指定,指定类路径的时候还有根据依赖关系来排列,被依赖的排在前面,否则会出现ClassNotFoundException的错误,这里支持觉得路径和相对路径,也支持通配符"*",比如wrapper.java.classpath.1=……/lib/wrapper*,不过这个通配符只能用于匹配文件名,不能用于匹配文件夹名称。

  wrapper.java.library.path.1=……/lib:指定Wrapper自带的类库文件存放文件夹,比如Wrapper.DLL文件等,只要指定到对应的上级目录名称就行,支持通配符。

  wrapper.java.library.path.1=……/lib:指定Wrapper自带的类库文件存放文件夹,比如Wrapper.DLL文件等,只要指定到对应的上级目录名称就行,支持通配符。

  wrapper.app.parameter.1= :指定运行类的main方法参数。

  wrapper.daemonize=TRUE:将服务注册成守护线程,就算程序关闭的话不影响服务的运行

  wrapper.ntservice.hide-console=false:不显示控制台

  wrapper.filter.trigger.1= , wrapper.filter.action.1 :指定过滤器和触发器,可以对控制台的输出信息进行监听,然后触发相应的操作

  wrapper.disable_shutdown_hook=TRUE:是否禁用 "关闭Hook" ,关闭的话在出现一般异常的情况下面可以忽略掉异常继续执行

  wrapper.console.loglevel=INFO:配置控制台的显示信息的级别,NONE不显示任何输出信息,FATAL只显示致命的错误消息,ERROR显示所有的错误消息,STATUS显示服务状态的改变,包括服务启动和停止等信息,INFO显示所有程序输出的信息和JVM显示的信息,如果程序无法正常启动,可以使用DEBUG显示详细的调试信息。

  wrapper.logfile.loglevel=INFO:配置日志记录文件要记录的输出信息的级别,参数值和wrapper.console.loglevel功能一致

  wrapper.logfile.maxsize=0:配置日志文件的最大大小,如果为0表示不限制日志文件的大小,支持标记符,“k”代表KB,“m”代表MB,如果要设置最大大小为100KB的话可以这样:wrapper.logfile.maxsize=100k

  wrapper.console.title=Wrapper Demo :控制台窗口显示标题,

  wrapper.ntservice.name=testwrapper: 系统服务的名称,

  wrapper.ntservice.displayname=Wrapper Demo:在服务管理中显示的名称

  wrapper.ntservice.description=Wrapper Demo的介绍信息: 在服务管理器显示服务的描述信息

  wrapper.ntservice.starttype=AUTO_START: 配置服务启动方式,可以选择AUTO_START(自动)和DEMAND_START(手动)两种方式。默认为自动。

  前几天在看Jetty源代码的时候发现它也是使用Wrapper注册成系统服务,使用的是第三种方式,可以参考一下


  importjava.io.PrintStream;
  importorg.mortbay.jetty.Server;
  importorg.mortbay.start.Main;
  importorg.tanukisoftware.wrapper.WrapperListener;
  importorg.tanukisoftware.wrapper.WrapperManager;
  publicclassJettyServiceWrapperListenerimplementsWrapperListener{
  privatestaticServer__server=null;
  publicvoidcontrolEvent(intevent){
  if((WrapperManager.isControlledByNativeWrapper())||((event!=200)&&(event!=201)&&(event!=203)))
  return;
  WrapperManager.stop(0);
  }
  publicIntegerstart(String[]args){
  for(inti=0;i<args.length;++i){
  System.out.println("ARG["+i+"]="+args[i]);
  }
  Main.main(args);
  returnnull;
  }
  publicintstop(intcode){
  try{
  System.out.println("JettyServiceWrapperListener:StoppingJetty6Service!!!");
  __server.stop();
  System.out.println("JettyServiceWrapperListener:Jetty6ServiceStopped!!!");
  returncode;
  }
  catch(Exceptione){
  System.out.println("StopServerError");
  e.printStackTrace();
  }
  return-1;
  }
  publicstaticvoidsetServer(Serverserver){
  __server=server;
  }
  publicstaticServergetServer(){
  return__server;
  }
  publicstaticvoidmain(String[]args){
  String[]newStrArgs=newString[args.length+1];
  newStrArgs[0]=System.getProperty("jetty.home")+"etc/jetty-win32-service.xml";
  for(inti=0;i<args.length;++i){
  newStrArgs[(i+1)]=args[i];
  }
  WrapperManager.start(newJettyServiceWrapperListener(),newStrArgs);
  }
  }

  这个类实现了Wrapper的WrapperListener 并实现了它的start和stop方法,start方法在服务器启动的时候调用,不过这里要注意,如果在30秒内你不能执行完start方法,系统会自动放弃这个服务的启动,解决办法可以在start方法使用线程,将比较耗时的操作放在这个线程执行,比如加载Spring文件等。而且如果在start方法执行出现异常,会终止服务的运行。这点要注意。

  Stop方法在服务停止启动,start和stop方法的参数可以在wrapper.conf文件里面配置。一般按照这样配置的话你的程序应该可以通过执行StartApp-NT.bat正常启动了。

编辑推荐:

1. Java多线程编程不提倡的方法

2. Java应用在多核服务器上压力不均衡问题

3. Java语言数据库操作的基本流程



分享到:
评论

相关推荐

    Java服务器程序设计

    用java进行客户端的applet (小程序)开发的技术已广为使用,而用java进行服务器端的servlet(服务器小程序)开发则尚需揭开其神秘的面纱,本书正是基于这样的目的编写的。全书从java服务器的体系结构、开发工具和...

    Java毕业设计:物业管理系统附毕业论文.rar

    连接成功后,将Java编写的用户界面移植到客户端的Linux操作系统下,并用这个界面试图实现与服务器上NT系统下的数据库SQL连接。以达到在不同的操作系统下可以互相调用的目的,实现Java的重要特性:可移植性。

    Java Service Wrapper配置Java台程序Windows服务

    对以上配置的服务进行测试,运行InstallMyApp-NT.bat将把你的应用(此处为App)安装到Win32系统服务中了。 打开控制面板-管理程序-服务,看到App已经在系统服务中了,其他用法就与我们熟悉的Windows服务一样了。 ...

    JAVA小区物业管理系统(源代码+论文)

    连接成功后,将Java编写的用户界面移植到客户端的Linux操作系统下,并用这个界面试图实现与服务器上NT系统下的数据库SQL连接。以达到在不同的操作系统下可以互相调用的目的,实现Java的重要特性:可移植性。 关键词...

    用JavaServiceWrapper将Java程序转化为NT系统服务

    NULL 博文链接:https://log-cd.iteye.com/blog/208256

    java应用程序安装成服务

    java应用程序安装成服务. 运行test/bin/App.bat,如果没有异常信息说明配置成功!然后可以执行InstallApp-NT.bat安装服务,执行UninstallApp-NT.bat卸载服务。

    JAVA物业管理+SQL

    连接成功后,将Java编写的用户界面移植到客户端的Linux操作系统下,并用这个界面试图实现与服务器上NT系统下的数据库SQL连接。以达到在不同的操作系统下可以互相调用的目的,实现Java的重要特性:可移植性。 有文档...

    JAVA物业管理系统设计与实现(论文+源代码)-jsp-java源程序代码.rar

    连接成功后,将Java编写的用户界面移植到客户端的Linux操作系统下,并用这个界面试图实现与服务器上NT系统下的数据库SQL连接。以达到在不同的操作系统下可以互相调用的目的,实现Java的重要特性:可移植性。

    java程序打包exe

    开源的工具,将java应用程序打包成exe文件,或者window的nt服务程序。

    Windows服务启动调用Java App --附vc6源码

    创建/移除windows服务,服务启动时将调用指定JAVA应用程序JAR 环境VC6 创建服务时带JAR文件及JVM环境设置,服务启动时创建JVM环境调用JAR程序 NTService.exe [ install | remove ] install: service install ...

    基于Java的酒店管理系统

    系统采用C/S模式,使用Java...本文简要介绍了基于Oracle数据库系统和Java程序语言开发实现的酒店管理系统,着重阐述了该系统开发实现过程,从系统的需求分析、模块设计、数据设计等各个环节都进行了较为详细的介绍。

    计算机程序设计(Java)-教案--单元十--数据库编程技术.docx.docx

    nt(Stringcolumnindex)throwsSQLException 计算机程序设计(Java)-教案--单元十--数据库编程技术全文共11页,当前为第2页。 计算机程序设计(Java)-教案--单元十--数据库编程技术全文共11页,当前为第2页。 以int...

    JAVA实现服务器和多用户跨平台的通讯

    随着网络技术的发展,我们的局域网越做越大,里面的服务器客户机数量也很多。在为我们提供了诸多便利的同时,我们发现,...为了解决这个问题,我们采用JAVA编程,成功的实现了 LINUX,WINDOWS NT,WIN98跨平台的通讯。

    基于JAVA的小区物业管理系统(毕业设计源代码+LW).rar

    连接成功后,将Java编写的用户界面移植到客户端的Linux操作系统下,并用这个界面试图实现与服务器上NT系统下的数据库SQL连接。以达到在不同的操作系统下可以互相调用的目的,实现Java的特性:可移值性

    毕业设计-JAVA物业管理系统设计与实现(论文+源代码)

    连接成功后,将Java编写的用户界面移植到客户端的Linux操作系统下,并用这个界面试图实现与服务器上NT系统下的数据库SQL连接。以达到在不同的操作系统下可以互相调用的目的,实现Java的重要特性:可移植性。 物业...

    jul4nt:Java日志处理程序将日志记录发布到Windows事件日志

    将日志记录发布到 如何使用? 该库在Maven Central上可用。 您可以通过将库添加到pom.xml dependencies部分来开始使用该库: &lt;!-- ... --&gt; &lt; groupId&gt;com.github.nikolaybespalov&lt;/ groupId&gt; ...

    java 常用英语词汇大全

    java 常用英语词汇大全 部分内容如下: algorithm n.算法['.lg.riem] annotation [java]代码注释[.n.u'tei..n] anonymous adj.匿名的[.'n.nim.s]‘ (反义:directly adv.直接地,立即[di'rektli, dai'rektli]) apply ...

    毕业设计(论文)-基于java的药品管理系统

    本系统可以实现用户在线注册、登录、修改密码,用户进行药品添加和管理、供应商的添加和管理,还可查询供应商提供的药品清单。 JSP(Java Server Pages )是由 Sun Micrososystems 公司倡导的、许多公司参与的 一起...

    LForum For Java 预览版发布 —— 精仿DZ!NT社区程序

    NULL 博文链接:https://lonlysky.iteye.com/blog/336569

    Java测试题2答案

    《Java测试题2》 &lt;br&gt;一、 选择 1.欲构造ArrayList类的一个实例,此类继承了List接口,下列哪个方法是正确的 ? B A ArrayList myList=new Object(); B List myList=new ArrayList(); C ...

Global site tag (gtag.js) - Google Analytics