本文介绍使用Apcahe Common Daemon组件将java程序注册为Windows服务的方法,同样使用这个库来实现服务的有著名的Tomcat,甚至我认为这个项目就是从Tomcat里剥出来的,理由很简单,他们的ICON是一样的。

Apcahe Common Daemon组件包含一个jar文件,两个exe文件。其实这么说是不对的,其实Apcahe Common Daemon组件仅仅只包含一个jar文件,而配合在windows上启动jar的是另一个项目,叫prorun。它仅仅负责在windows上启动jar而在UNIX类OS上有别的工具来完成。

废话不多说,从Apache网站上下载commons-daemon-1.1.0.jar文件,当然你可以是使用maven。添加到项目后,像下面代码一样创建一个实现了Daemon接口的启动类,请忽略自动实现的destroy函数和init函数,在windows平台上,这两个函数不会被调用。而请重点关注startService和stopService两个函数,这是我们公开给外部调用工具prorun的静态接口,我们的程序会从这两个函数进出。

public class ServiceLauncher implements Daemon {private static ServiceLauncher launcher;private Service service;@Overridepublic void destroy() {}@Overridepublic void init(DaemonContext arg0) throws DaemonInitException, Exception {}@Overridepublic void start() throws Exception {service = new Service();Thread t = new Thread(service);t.setDaemon(true);t.start();t.join();}@Overridepublic void stop() throws Exception {service.finish();}public static void startService(String[] args) {launcher = new ServiceLauncher(args);launcher.start();}public static void stopService(String[] args) {      launcher.stop();}
}

这段代码启动了一个子线程,名字叫service,启动它以后会等待,直到它自己退出。因为外部的执行工具prorun会随时调用stopService来结束服务,所以实际上真正执行任务的service线程和当前的这个线程是被控制者和控制者的关系。也不要轻易的使用kill来杀死service线程,这会导致正在实行的任务中途退出,这不是一个优雅的设计。

至于service线程里的工作属于项目范畴,不做介绍。现在介绍如何使用外部工具来启动这个服务。

首先你得下载prcrun程序包,例如:commons-daemon-1.1.0-bin-windows.zip,解压它会得到两个可执行程序prunsrv.exe和prunmgr.exe,以及一个amd64版本的prunsrv.exe,它应该是64位版本的意思。请注意,如果你使用了32位版本的prunsrv.exe的话,那么你的jvm也必须是32位的,否则无法运行。

得到这两个程序后再将刚才我们写的java程序打包导出位一个可执行jar包,我们假设它叫program.jar,然后和刚才得到的两个程序放在同一个文件夹下。接下来请把prunsrv.exe改名为program.exe,把prunmgr.exe改名为proguramw.exe。你问我为啥要改名?因为我高兴。

接下来我们需要注册这个jar到windows服务管理器里了,请写一个BAT文件:

@echo offset EXEC_DIR=%~dp0
set INSTALL_PATH=%EXEC_DIR%program.exe
set JVM_PATH=%EXEC_DIR%\jre\bin\client\jvm.dll%INSTALL_PATH% //IS//<Service Name> --DisplayName="XXX" --Description="XXX" ^
--Install=%INSTALL_PATH% --Startup=manual --Jvm=%JVM_PATH% ^
--StartMode=jvm --StopMode=jvm ^
--Classpath=%EXEC_DIR%\lib\*;%EXEC_DIR%\* ^
--StartClass=xx.ServiceLauncher --StartParams=%EXEC_DIR% --StartMethod=startService ^
--StopClass=xx.ServiceLauncher  --StopMethod=stopService ^
--LogPath=%EXEC_DIR%\logs --LogPrefix=Service --LogLevel=DEBUG --StdOutput=auto --StdError=autoif "%errorlevel%" == "0" ( echo Success
) else (echo Failed to install Windows Service
)
@echo on

在这个BAT里,我们使用program.exe来注册这个jar文件到windows服务管理器里,参数比较多,但是其实管用的主要有这几个:

//IS//<Service Name> 服务名

它会显示在Windows服务管理器中,这是操作服务的唯一的句柄,启动关闭都靠这个名字。

--Startup=manual 启动方式,这是手动,自动是auto

--Jvm=%JVM_PATH% JVM的路径,我们需要jvm.dll

--StartClass=xx.ServiceLauncher --StartParams=%EXEC_DIR% --StartMethod=startService  启动目标包和目标函数,以及传递给这个函数的参数。

--StopClass=xx.ServiceLauncher  --StopMethod=stopService 这是关闭时入口的设置

其他的就不重要了,自己理解吧。但是如何启动这个服务呢,可以到windows服务管理器里手动启动,也可以双击刚才改名的proguramw.exe,它会自动在windows里去找和自己名字一样的widnwos服务,然后弹出界面,你只需要操作界面就可以启动和关闭这个服务了。你也可以使用命令行来操作proguramw.exe启动这个服务,它可以让你把自己隐藏到托盘区域等等。

转载于:https://www.cnblogs.com/mubawa/p/9560520.html

使用Apache Common Daemon实现Windows服务相关推荐

  1. WEB文件上传之apache common upload使用(一)

    文件上传一个经常用到的功能,它有许多中实现的方案. 页面表单 + RFC1897规范 + http协议上传 页面控件(flash/html5/activeX/applet) + RFC1897规范 + ...

  2. windows service.bat java 内存设置_Tomcat加大内存设置从windows服务启动不生效的问题...

    默认安装tomcat5然后在catalina.bat最前面加入set JAVA_OPTS=-Xms128m -Xmx350m 如果用startup.bat启动tomcat,OK设置生效.够成功的分配2 ...

  3. Java Service Wrapper 发布Java程序为Windows服务

    下载Windows版本:https://www.krenger.ch/blog/java-service-wrapper-3-5-37-for-windows-x64/ 转自:F:\java\bhGe ...

  4. java桌面程序与服务交互_Java作为具有交互式桌面支持的Windows服务并读取curren登录用户...

    我有一个java程序,像apache Common Deamon(prunsrv)包装的windows服务一样工作,但是我有两个问题: 1.使用交互式桌面配置的服务可以查看摆动对话框并尝试从应用程序中 ...

  5. SpringBoot打包部署成Windows服务的详细步骤

    SpringBoot打包部署成Windows服务的详细步骤 1.SpringBoot 1.1 pom.xml 1.2 项目代码 1.2.1 项目结构 1.2.2 Controller的代码 1.2.3 ...

  6. spring boot项目 部署 使用Procrun 注册为windows服务。

    1.下载Procrun 下载链接:https://downloads.apache.org/commons/daemon/binaries/windows/ 2.新建部署目录workSpace 3.添 ...

  7. zookeeper以Windows服务安装运行

    1.下载的Zookeeper是.cmd的批处理命令运行的,默认没有提供以windows服务的方式运行的方案 下载地址:http://zookeeper.apache.org/ 2.下载prunsrv ...

  8. 面试官问:对象池技术了解吗?apache common pool2呢?

    欢迎关注方志朋的博客,回复"666"获面试宝典 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是 ...

  9. java建立_利用Java创建Windows服务

    1.Java测试代码 importorg.apache.log4j.Logger;public classTest {private static Logger logger = Logger.get ...

最新文章

  1. MSDynamicsAX2009成本处理与重估(中文)
  2. 在Python中实现SVM分类
  3. hdu 4506(快速幂+找规律)
  4. java super object,java学习记录笔记--继承,super,Object类
  5. MySQL 存储过程的基本用法
  6. 只要300页!火遍全网的NET6+linux知识手册!拿走不谢!
  7. idea怎么更改推到github的路径_IDEA 拉取、上传、更新 项目到 Gitee+GitHub_超详细超简单版...
  8. html提现页面模板,提现记录.html
  9. java中$和 的区别详解_MyBatis中#{}和${}的区别详解
  10. 这可能是最全的JAVA入门教程 ~
  11. 实现国标GB/T28181流媒体服务解决方案EasyGBS之GB35114和GB28181的注册信令流程简介
  12. 计算机工业机器人编程,15个你不知道的工业机器人编程冷知识
  13. python gdal 读取图层及EPSG
  14. H5页面 iPhoneX适配
  15. 2022《中国企业敏捷实践白皮书》调研全面启动
  16. 关于scene understanding场景理解概念的理解
  17. Leetcode | Insertion Sort List | 初出茅庐
  18. 高可用架构的技术变迁与演进经历了怎样的过程?
  19. 网络工程行业有什么含金量比较高的工程师证书值得推荐?
  20. 中国十大调查研究咨询公司排名数据情况

热门文章

  1. 反射机制2,Class类的使用
  2. 架构设计:生产者/消费者模式 第3页:队列缓冲区
  3. WKQ学习(后台知识)
  4. c++面试准备之螺旋队列
  5. H3C 基于IP的限速
  6. iframe js 加载失败_如何提高Vue项目首页的加载速度
  7. linux集群搭建coolrainbow,Rainbow°110408_教程▍KBFS听歌学韩语—So Cool[Rainbow]
  8. php底层实现也是c语言,深入php内核,从底层c语言剖析php实现原理
  9. vue 为全局变量赋值_vue设置全局变量和修改
  10. Nacos分布式应用配置管理