Как написать демон Java - PullRequest
       20

Как написать демон Java

12 голосов
/ 19 октября 2011

Это будет сетевое приложение, которое всегда (или почти всегда, насколько я могу управлять) будет прослушивать данный порт.

Я довольно новичок в Java и очень плохо знаком с программированием на стороне, не являющейся веб-сервером, поэтому я хотел бы получить отзывы сообщества о моих предположениях и предварительных планах.

Я читал о jsvc (http://commons.apache.org/daemon/jsvc.html) и в настоящее время работаю в предположении, что это «лучший» способ написать демон в java для linux-бокса (вероятно, под управлением centOS).

Можно ли сконфигурировать nagios для наблюдения за тем, работает ли мой демон, и для предупреждения меня или системного администратора, если это не так? (Полагаю, да, но я не очень талантливый администратор sys)

Это будет клиентское приложение SMPP (или, я полагаю, ESME-приложение), поэтому я выбрал Java, так как он кажется очень зрелой платформой для SMPP. Однако я знаю, что более «традиционно» писать демон на C / C ++. Могу ли я столкнуться с существенными недостатками современной Java, выполняющей довольно простые задачи?

Каков наилучший способ управления развертыванием новых сборок? Просто остановите демон и замените двоичный файл как можно быстрее и перезапустите?

Любой другой вклад будет принят с благодарностью.

Ответы [ 2 ]

20 голосов
/ 19 октября 2011

Как написать демон Java, работающий 24/7 ...

Мы запускаем на наших серверах Linux ряд приложений 24/365, которые просто вызывают Java, как показано ниже - не нужно никаких оболочек C:

nohup java -D... -X... -jar something.jar ... < /dev/null > output.log 2>&1 &

Это позволит запустить банку в фоновом режиме (nohup ... &) без ввода (< /dev/null), а вывод (stdout и stderr) будет перенаправлен в файл журнала (> output.log 2>&1). У нас есть распределенная инфраструктура журналирования, но некоторый вывод консоли (такой как дамп потока) все еще ожидается. Эти приложения могут работать месяцами, пока мы не обновим их.

Можно ли настроить nagios для наблюдения за тем, работает ли мой демон, и для предупреждения меня или системного администратора, если это не так?

С точки зрения мониторинга вы многое можете сделать. Nagios, похоже, имеет плагин JMX для проверки информации, отображаемой jconsole. Существует также множество собственных утилит для ведения журналов и мониторинга JMX. У нас есть внутренние зеленые / желтые / красные индикаторы, которые можно проверить с помощью JMX и легко проверить. Я также экспортировал простую службу JMX / HTTP из каждого приложения, чтобы предоставить информацию о состоянии, позволяющую сторонним инструментам мониторинга обнаруживать сбои.

Это будет клиентское приложение SMPP (или, я полагаю, ESME-приложение), поэтому я выбрал Java, так как он кажется очень зрелой платформой для SMPP.

Полагаю, вы имеете в виду SMPP ? Если так, то я не вижу причин, по которым Java не может сделать хорошую работу. Наши приложения выполняют широкий спектр протоколов HTTP, UDP, SMTP, JDBC, LDAP и других в режиме реального времени. Мы используем Jgroups на лот, что обеспечивает полный аутентифицированный, зашифрованный сетевой стек в Java.

Каков наилучший способ управления развертыванием новых сборок? Просто остановите демон и замените двоичный файл как можно быстрее и перезапустите?

Что касается замены работающего бинарного файла на лету, то это сложнее. У нас есть VIP и мы заменяем двоичные файлы на досуге. Наши внутренние протоколы предназначены для аварийного переключения. Если у вас нет VIP, то одна вещь, которую следует учитывать, это упорядоченная передача. Вы загружаете новый jar, и он обращается к приложению, на котором запущен старый jar, когда он готов связываться с новым портом. Затем старое приложение связывается, а новое связывается сразу же после этого. Нечто подобное.

Надеюсь, это поможет.

7 голосов
/ 19 октября 2011

Если вы действительно хотите, чтобы что-то работало без остановок в * nix, я рекомендую вам взглянуть на daemontools .

Есть несколько примеров, как это сделать здесь и здесь .

По сути svscan будет запускать процесс, который отслеживает ваш Java-процесс из init, и каждый раз, когда он падает, он перезапускается.

...