如何将守护进程实现设置为Windows服务

关于如何将实现org.apache.commons.daemon.Daemon接口的类注册为Windows服务,我没有找到任何真正好的例子(实际上我没有找到一个例子)。

我是否必须使用procrun注册此实现? 但是实现接口似乎没有意义,因为procrun可以将任何程序注册为Windows服务。

此外,procrun页面上似乎有一个文档错误( http://commons.apache.org/proper/commons-daemon/procrun.html ):

--StartMethod参数的说明指出:

注意:在jvm模式下,start方法在调用stop方法之前不应返回。

但是在“在jvm模式下使用Procrun”部分的页面下方:

注意,方法处理服务启动应该创建并启动一个单独的线程来执行处理,然后返回。 从不同的线程调用start和stop方法。

我读错了还是这有点矛盾? 什么是静态启动(String [] args)方法的正确行为?

最好的祝福

对于记录:

我是否必须使用procrun注册此实现? 但是实现接口似乎没有意义,因为procrun可以将任何程序注册为Windows服务。

是的,该服务需要使用prunsrv在Windows中注册。 例如,通过以下调用:

 prunsrv.exe //IS//MyTestService ^ --DisplayName="My Test Service" --Description="Doesn't really do anything" ^ --Install=@@PATH_TO_PRUNSRV@@\prunsrv.exe ^ --Startup=manual ^ --Jvm=auto ^ --Classpath="@@PUT_FULL_CLASSPATH_HERE@@" ^ --StartMode=jvm ^ --StartClass==com.stackoverflow.questions.31556478.ServiceLauncher ^ --StartParams="@@PUT_ANY_START_ARGUMENTS_HERE@@" ^ --StartMethod=start ^ --StopMode=jvm ^ --StopClass=com.stackoverflow.questions.31556478.ServiceLauncher ^ --StopMethod=stop 

在此之后,服务可以启动

 prunsrv //ES//MyTestSevice 

什么是静态启动(String [] args)方法的正确行为?

测试两种变体,只有实现工作,保留在start-method中并没有产生额外的线程。 这是一个启动器实现,可以使用上面的prunsrv调用注册,看起来像这样(没有任何保证):

 package com.stackoverflow.questions.31556478; import java.util.Arrays; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ServiceLauncher { private static final Logger LOGGER = LoggerFactory.getLogger(ServiceLauncher.class); private static SomeServer mServer; public static void start(final String[] args) { LOGGER.debug("Start called: {}", Arrays.toString(args)); try { mServer = new SomeServer(args); mServer.start(); } catch (final Exception e) { LOGGER.error("Terminating due to Exception: ", e); } } public static void stop(final String[] args) throws Exception { LOGGER.debug("Stop called: {}", Arrays.toString(args)); synchronized (ServiceLauncher.class) { if (mServer != null) { mServer.stop(); } } } }