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