我没有找到任何关于如何将实现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)方法的正确行为?
祝你好运
答案 0 :(得分:2)
记录:
我是否必须使用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();
}
}
}
}