Более простой сценарий инициализации для демонов Java? - PullRequest
1 голос
/ 08 марта 2011

Я написал небольшую библиотеку для создания сервисов / демонов на Java. Идея проста. При запуске приложения вы передаете команду и номер порта. Если команда является командой запуска, новый экземпляр вашего приложения будет запущен на указанном порту. В противном случае команда будет отправлена ​​любому экземпляру, который может быть запущен на этом порту.

Короче говоря, библиотека предоставляет метод daemonize, который запускает поток контроллера демона. Он использует сокеты, чтобы приложение взаимодействовало с экземплярами самого себя (как вы, вероятно, уже поняли).

Для ясности, вот пример того, как вы бы его использовали:

public class MyApp extends Daemon
{
    public static void main(String[] args)
    {
        if (daemonize(MyApp.class, args))
        {
            // normal main body
            startMyServerOrWhatever();
        }
        else
        {
            // failed to start or send command to daemon
            // probably wrong syntax or unknown command
            printUsageInfoAndExit();
        }
    }

    @Command(start = true)
    public static int start()
    {
        // executed on "start" command, e.g. java -jar MyApp.jar start 8899
        doSomeInitializing();
        return 0; // return 0 or void to detach from console
    }

    @Command
    public static void mycmd()
    {
        // executed on "mycmd" command, i.e. java -jar MyApp.jar mycmd 8899
        doSomethingCool();
    }

    @Command(stop = true)
    public static int stop()
    {
        // executed on "stop" command, i.e. java -jar MyApp.jar stop 8899
        doSomeCleanup();
        return 0; // used as application exit code
    }
}

Библиотека работает очень хорошо, и я использовал ее для создания пары демонов, которые будут работать на сервере Linux. Чего сейчас не хватает, так это некоторых сценариев, позволяющих администраторам управлять этими демонами, как они контролируют других демонов на сервере (например, запускаться при загрузке).

К сожалению, мои * nix навыки, особенно когда дело доходит до сценариев, не являются высшим уровнем. У меня есть общее представление о процедуре инициализации в стиле BSD (rc.d), но, глядя на примеры сценариев вроде этот , я чувствую себя немного потерянным.

Итак, мой вопрос: нет ли более простого способа сделать это в моем случае? Я имею в виду, что мои демоны уже понимают команды и сами должны нести ответственность за любые действия (за исключением случая, когда демон не отвечает на остановку - после некоторого времени ожидания его следует уничтожить).

Ответы [ 2 ]

1 голос
/ 08 марта 2011

Вы действительно должны взглянуть на java-сервис-оболочку от программы tanuki.
См. http://wrapper.tanukisoftware.com/

Что мне нравится в их подходе, так это то, что они стандартизировали процессы обслуживания deamon и windowsс помощью одного инструмента и общих сценариев.

Я заметил хороший уровень применения этого инструмента в некоторых громких проектах, таких как nexus, servicemix и других.

И когда я сталкиваюсь с проектом, который использует Java Service Wrapper для управления процессами deamon, тогда набор команд и конфигурация мне уже знакомы, что снижает кривую обучения.

Возможно, выможет вписать ваш механизм контроллера сокетов в эту существующую структуру.

0 голосов
/ 27 октября 2012

не проще?

Я однажды написал сценариев демона , чтобы запустить наше Java-приложение через SSH. Они минималистичны - без принудительного уничтожения или интеграции rc.d / SMF, только запуск и завершение работы демона с использованием сигнала TERM.

...