Java 如何将守护程序实现设置为windows服务

Java 如何将守护程序实现设置为windows服务,java,windows-services,apache-commons-daemon,Java,Windows Services,Apache Commons Daemon,关于如何将实现org.apache.commons.daemon.daemon接口的类注册为Windows服务,我没有找到任何真正好的示例(实际上我没有找到一个示例) 我必须使用ProCurn注册此实现吗?但是,由于procrun可以将任何程序注册为windows服务,因此实现该接口似乎没有意义 此外,procrun页()上似乎有一个docu错误: --StartMethod参数说明如下: 注意:在jvm模式下,在调用stop方法之前,start方法不应返回 但在“在jvm模式下使用ProCur

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

我必须使用ProCurn注册此实现吗?但是,由于procrun可以将任何程序注册为windows服务,因此实现该接口似乎没有意义

此外,procrun页()上似乎有一个docu错误:

--StartMethod
参数说明如下:

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

但在“在jvm模式下使用ProCurn”一节中,再往下看:

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

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

向记录致以最诚挚的问候

我必须使用ProCurn注册此实现吗?但是,由于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方法中的实现起作用,并且没有产生额外的线程。这是一个可以注册到上述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();
      }
    }
  }
}