Проблема: у меня есть автономное приложение Java (далее именуемое «агент»), которое работает как служба на внутренних серверах компании. Он действует как удаленный агент для некоторых центральных серверов. По мере развертывания агента в большем количестве мест управление ими становится все сложнее. В частности: продвижение обновлений болезненно, потому что это довольно ручной процесс, а получение доступа к журналам и другой информации о средах, в которых работают агенты, проблематично, что затрудняет отладку. Обсуждаемые серверы являются автономными и необслуживаемыми, что означает, что это должен быть полностью автоматизированный процесс без ручного вмешательства, поэтому Java Web Start не является жизнеспособным решением.
Предлагаемое решение. Сделайте так, чтобы агент периодически звонил домой (на центральные серверы), чтобы предоставлять информацию о состоянии агента и проверять наличие обновлений.
Я открыт для других предлагаемых решений проблемы, но у меня уже есть рабочий прототип для идеи «статус и самообновления», на которой и сосредоточен этот вопрос.
То, что я придумал, на самом деле представляет собой отдельный проект, который действует как оболочка для агента. Оболочка периодически вызывает центральный сервер через HTTP для проверки наличия обновленной версии агента. Обнаружив обновление, он загружает новую версию, выключает работающий агент и запускает новый. Если это кажется странным или окольным решением, вот еще несколько соображений / ограничений, на которые стоит обратить внимание:
- Когда оболочка получает новую версию агента, могут быть новые зависимости JAR, что означает изменение пути к классам, а это означает, что я, вероятно, хочу создать отдельный процесс Java вместо того, чтобы возиться с ClassLoaders и подвергаться риску утечки памяти постоянного поколения, что потребует ручного вмешательства - именно то, от чего я пытаюсь уйти. Вот почему в моем прототипе я использовал отдельный процесс-оболочку для управления обновлениями агента.
- Ресурсы некоторых серверов, на которых развернуты агенты, ограничены, поэтому любое решение должно потреблять мало ресурсов ЦП и памяти. Это заставляет меня хотеть решения, которое не связано с развертыванием новой JVM и является шагом против наличия отдельного процесса-оболочки.
- Агент уже развернут как на серверах Windows, так и на серверах RHEL, поэтому решение должно быть кроссплатформенным, хотя у меня не возникнет проблем с дублированием разумного объема процесса в пакетных сценариях и сценариях bash, чтобы все заработало.
Вопрос. Как уже говорилось, я хочу знать, как создать самообновляющееся приложение Java. В частности, существуют ли какие-либо фреймворки / библиотеки, которые могли бы мне в этом помочь? Может ли кто-нибудь с опытом в этой области дать мне несколько советов?