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

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

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

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

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

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

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

Любой другой вход был бы весьма полезен.

Ответ 1

Как написать демон Java, который имеет 24/7 время безотказной работы...

Мы запускаем ряд приложений 24/365 на наших Linux-серверах, которые просто называют 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 для мониторинга того, работает ли мой демон или предупреждать меня или администратор sys, когда это не так?

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

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

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

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

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

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

Ответ 2

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

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

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