2014-01-31 2 views
1

Я демоннизировал 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-порту.

ответ

0

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

+0

Простите меня, если я еще не знаю очевидного. Запускает ли подчиненная оболочка с символом & при выходе из основной оболочки? Кроме того, как можно было бы изящно завершить фоновый Java-процесс таким образом, чтобы запрос мог быть захвачен в коде и проведена некоторая очистка? – captaintrips

+0

1. Да, процесс завершается при выходе из JVM. 2. Многие серверы (например, tomcat и jetty) прослушивают порт «shutdown» и ждут получения определенных данных (например, строки «SHUTDOWN») для отправки на этом порту, после чего они выполняют весь код очистки и завершают работу. –

0

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

Вариант А: установивших службы в 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 

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

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

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^