Запустите несколько экземпляров Java-демона с помощью Commons Daemon / JSVC

Я демонизировал Java-программу, используя библиотеку Commons Daemon / JSVC, и могу успешно запустить / остановить один экземпляр моей службы. Что мне действительно нужно сделать, так это уметь запускать несколько экземпляров моего сервиса, запускать и останавливать каждый из них с разными аргументами команды.

Вероятно, не относится к этой проблеме, но немного предыстории.. мой сервис включает в себя прослушиватель HTTP, который привязан к определенному порту. Каждый экземпляр будет инициализирован для прослушивания другого порта.

Моя проблема в том, что я не могу запустить более одного экземпляра моего Java-класса, используя встроенную функциональность, предоставляемую Commons Daemon. Может быть, я что-то упустил. Я давний разработчик для Windows/C#, но относительно новичок в Java/Linux/Shell-скриптинге.

Сценарий оболочки для запуска процесса JSVC и запуска / остановки моего демона приведен ниже. Это то, что я нашел на этом сайте в другом посте, с небольшими изменениями. Он проходит через некоторые командные аргументы, которые требуются моему демону, и я вызываю этот сценарий sh из отдельных сценариев запуска и остановки, которые определяют эти параметры.

#!/bin/sh

# Setup variables
EXEC=/usr/bin/jsvc
JAVA_HOME=/usr/lib/jvm/java-7-oracle
CLASS_PATH="/usr/share/java/commons-daemon-z.0.15.jar":"/opt/LuckyElephant/lib/LuckyElephant.jar"
CLASS=co.rightside.luckyelephant.Main
USER=ubuntu
PID=/tmp/luckyelephant.pid
LOG_OUT=/tmp/luckyelephant.out
LOG_ERR=/tmp/luckyelephant.err
ARGS="$*"

do_exec()
{
    $EXEC -home "$JAVA_HOME" -cp $CLASS_PATH -user $USER -outfile $LOG_OUT -errfile $LOG_ERR -pidfile $PID $1 $CLASS $ARGS
}

case "$1" in
    start)
        do_exec
            ;;
    stop)
        do_exec "-stop"
            ;;
    restart)
        if [ -f "$PID" ]; then
            do_exec "-stop"
            do_exec
        else
            echo "service not running, will do nothing"
            exit 1
        fi
            ;;
    *)
            echo "usage: luckyelephant {start|stop|restart}" >&2
            exit 3
            ;;
esac

Если запуск более одного экземпляра уникального класса Java невозможен в JSVC, что является альтернативой? Мне нужен безопасный и стабильный способ для запуска нескольких экземпляров этой службы (я буду делать это удаленно и программно с использованием SSH), и каждый экземпляр должен завершать работу изящно по завершении из-за привязки к порту TCP.

3 ответа

Предполагая, что необходимо развернуть n экземпляров этого демона, скажем, 3 (jDaemon_A, jDaemon_B & jDaemon_C). Я хотел бы подойти к проблеме, используя один из следующих 3 вариантов:

Вариант A: Служба развернута 3 раза каждый, используя отдельный каталог данных. И используйте соглашение об именах, чтобы различать каждый, например,

jDaemon_A using directory /root/jdA;
jDaemon_B using directory /root/jdB;
jDaemon_C using directory /root/jdC;

так что вы можете начать каждый отдельный

service jDaemon_A start
etc…

Вариант B: Реализуйте вышеупомянутое, плюс еще один Java-класс, который будет управлять любым количеством экземпляров в зависимости от того, что вам нравится, так что вы можете передавать аргументы:

service jDaemon_Manager start all
service jDaemon_Manager start B

Предоставление возможности запуска всего или только одного конкретного экземпляра.

Вариант C: многопоточность. Рассматривали ли вы, что текущий демон работает только с 1 экземпляром в многопоточном режиме, так что одна и та же логика запускается одновременно в разных потоках? Таким образом, у вас будет работать только один демон.

Это может быть жизнеспособным решением, поскольку потоки могут работать относительно независимо.

Конечно, это может быть неприменимо в вашем случае, но я подумал, что этот маршрут стоит рассмотреть.

Мне удалось запустить несколько экземпляров демона, используя разные pid-файлы для каждого экземпляра. А также различные файлы log_out и log_err для облегчения отслеживания.

Вы можете просто запустить программу Java с & в конце, чтобы он работал в фоновом режиме.

Другие вопросы по тегам