Как настроить реализацию Daemon в качестве службы Windows

Я не нашел ни одного действительно хорошего примера (на самом деле я не нашел ни одного примера) о том, как зарегистрировать класс, который реализует org.apache.commons.daemon.Daemon интерфейс как служба Windows.

Нужно ли регистрировать эту реализацию, используя procrun? Но в реализации интерфейса, похоже, нет смысла, так как procrun может зарегистрировать любую программу в качестве службы Windows.

Кроме того, на странице прокрунтера, похоже, есть ошибка с документами ( http://commons.apache.org/proper/commons-daemon/procrun.html):

Описание --StartMethod Состояния параметров:

Примечание: в режиме jvm метод start не должен возвращаться до тех пор, пока не будет вызван метод stop.

Но далее вниз по странице в разделе "Использование Procrun в режиме jvm":

Обратите внимание, что метод обработки службы start должен создать и запустить отдельный поток для выполнения обработки, а затем вернуться. Методы start и stop вызываются из разных потоков.

Я читаю это неправильно или это немного противоречиво? И каково будет правильное поведение метода статического запуска (String[] args)?

С наилучшими пожеланиями

1 ответ

Решение

Для записей:

Нужно ли регистрировать эту реализацию, используя procrun? Но в реализации интерфейса, похоже, нет смысла, так как procrun может зарегистрировать любую программу в качестве службы Windows.

Да, служба должна быть зарегистрирована в Windows, используя prunsrv. Например, с помощью следующего вызова:

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.stackru.questions.31556478.ServiceLauncher ^
    --StartParams="@@PUT_ANY_START_ARGUMENTS_HERE@@" ^
    --StartMethod=start ^
    --StopMode=jvm ^
    --StopClass=com.stackru.questions.31556478.ServiceLauncher ^
    --StopMethod=stop

После этого сервис может быть запущен

prunsrv //ES//MyTestSevice


И каково будет правильное поведение метода статического запуска (String[] args)?

При тестировании обоих вариантов работала только реализация, которая оставалась в методе start и не создавала дополнительных потоков. Это реализация запуска, которую можно зарегистрировать с помощью указанного выше вызова prunsrv, который будет выглядеть примерно так (без каких-либо гарантий):

package com.stackru.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();
      }
    }
  }
}
Другие вопросы по тегам