2011-10-18 5 views
12

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

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

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

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

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

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

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

+1

В документе * jsvc * doc говорится, что он позволяет приложению (например, Tomcat) выполнять какое-либо приложение как root (например, привязать к порту <1024), а затем снизить привилегии приложения. Я, честно говоря, не люблю позволять работать как root. То, как я привязываюсь к порту <1024, работает как не-root и выполняет перенаправление брандмауэра, например: * «iptables -t nat -I PREROUTING -p tcp -dport 80 -j REDIRECT - to-ports 8080 «* Обратите внимание, что вы также можете ** использовать такой трюк, чтобы развернуть новый демон * без необходимости« останавливать демона и как можно быстрее заменить двоичный файл »[sic] .... * (продолжение следует) * – TacticalCoder

+1

Если вы привязаны к уникальной машине, вы можете использовать следующий трюк: оставьте «старый» демон (скажем, на порт 8080, из которого 80 перенаправляются), затем разверните новый демон (скажем, на порт 8081). Проверьте, что все работает нормально, и как только вы убедитесь, что ваш новый демон хорош, просто измените перенаправление портов 80-> 8080 на 80-> 8081. Единственный раз, когда требуется * root *, необходимо изменить перенаправление брандмауэра. В Unix-подобных системах вы можете установить Java и Tomcat без необходимости входить в систему как * root * (если вы не используете никаких * .deb * или * .rpm * пакетов). – TacticalCoder

+0

Я думаю, что вы правы в jsvc, и ваше предложение о перенаправлении портов является удивительным, и я, скорее всего, сделаю это. Благодаря! –

ответ

19

Как написать демон 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 plugin для тестирования информации, отображаемой jconsole. Существует также множество встроенных JMX-протоколов и средств мониторинга. У нас есть внутренние индикаторы зеленого/желтого/красного цвета, которые можно вытащить с помощью JMX и легко проверить. Я также экспортировал simple JMX/HTTP service из каждого приложения, чтобы предоставить информацию о состоянии, облегчающую для сторонних средств мониторинга обнаружение сбоев.

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

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

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

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

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

+0

Мой вопрос достаточно расплывчатый, что нет «реального» ответа, но этот пост является потрясающим и полезным, поэтому вы можете получить галочку! –

+0

Может ли кто-нибудь описать написанный сценарий Linux? –

+0

Я описываю это прямо под ним в ответ @BasitAnwer. – Gray

7

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

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

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

+1

Программы на Java действительно не «сбой» @krico. Они могут получить ошибки VM, но это случается крайне редко в моем опыте. Они могут, однако, исчерпать память и перестать реагировать в зависимости от утечек памяти или других проблем приложения. В этом случае я не уверен, что «daemontools» поможет. Я думаю, что более активный монитор, который вызывает приложение, в порядке. – Gray

+0

@Gray. Хотя в развитии они этого не делают, но, как только в производстве, они это делают. для кода krico +1 daemontools является уродливым и старым, но он по-прежнему работает. –

+0

Huh. Я запускаю Java-приложения в кластере в производстве в течение многих лет, может быть, несколько ошибок VM.Думаю, это зависит от JVM/OS. – Gray

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