Как сделать самообновление приложения Java?

Проблема: у меня есть автономное приложение Java (далее именуемое «агент»), которое работает как служба на внутренних серверах компании. Он действует как удаленный агент для некоторых центральных серверов. По мере развертывания агента в большем количестве мест управление ими становится все сложнее. В частности: продвижение обновлений болезненно, потому что это довольно ручной процесс, а получение доступа к журналам и другой информации о средах, в которых работают агенты, проблематично, что затрудняет отладку. Обсуждаемые серверы являются автономными и необслуживаемыми, что означает, что это должен быть полностью автоматизированный процесс без ручного вмешательства, поэтому Java Web Start не является жизнеспособным решением.

Предлагаемое решение. Сделайте так, чтобы агент периодически звонил домой (на центральные серверы), чтобы предоставлять информацию о состоянии агента и проверять наличие обновлений.

Я открыт для других предлагаемых решений проблемы, но у меня уже есть рабочий прототип для идеи «статус и самообновления», на которой и сосредоточен этот вопрос.

То, что я придумал, на самом деле представляет собой отдельный проект, который действует как оболочка для агента. Оболочка периодически вызывает центральный сервер через HTTP для проверки наличия обновленной версии агента. Обнаружив обновление, он загружает новую версию, выключает работающий агент и запускает новый. Если это кажется странным или окольным решением, вот еще несколько соображений / ограничений, на которые стоит обратить внимание:

  1. Когда оболочка получает новую версию агента, могут быть новые зависимости JAR, что означает изменение пути к классам, а это означает, что я, вероятно, хочу создать отдельный процесс Java вместо того, чтобы возиться с ClassLoaders и подвергаться риску утечки памяти постоянного поколения, что потребует ручного вмешательства - именно то, от чего я пытаюсь уйти. Вот почему в моем прототипе я использовал отдельный процесс-оболочку для управления обновлениями агента.
  2. Ресурсы некоторых серверов, на которых развернуты агенты, ограничены, поэтому любое решение должно потреблять мало ресурсов ЦП и памяти. Это заставляет меня хотеть решения, которое не связано с развертыванием новой JVM и является шагом против наличия отдельного процесса-оболочки.
  3. Агент уже развернут как на серверах Windows, так и на серверах RHEL, поэтому решение должно быть кроссплатформенным, хотя у меня не возникнет проблем с дублированием разумного объема процесса в пакетных сценариях и сценариях bash, чтобы все заработало.

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


person Ryan Stewart    schedule 20.04.2012    source источник
comment
Ваше решение не позволит вам обновить саму оболочку, верно?   -  person Miquel    schedule 21.04.2012
comment
@ Микель: Верно. Идеальным решением будет решение, в котором нет ничего развернутого, что нельзя обновить. Мой прототип оболочки, конечно, не такой, но в идеале (опять же) оболочка не нуждается в обновлениях, потому что у нее одна простая задача и несколько движущихся частей.   -  person Ryan Stewart    schedule 21.04.2012
comment
@ MarkO'Connor: Хорошая ссылка. Я должен подумать об этом. Модель Jenkins предлагает мне перейти с вытягивания на выталкивание, когда центральные серверы могут быть направлены на установку агента или обновления на удаленный сервер через SSH или какой-либо другой протокол.   -  person Ryan Stewart    schedule 21.04.2012
comment
Какой раствор вы приняли через 2 года? Написать собственную оболочку или использовать существующие фреймворки / библиотеки, например ace.apache.org? У меня такая же проблема с управлением ›3000 агентов.   -  person Lee Chee Kiam    schedule 09.08.2014
comment
@LeeCheeKiam, можешь проверить мой добавленный ответ?   -  person Amr Lotfy    schedule 18.06.2015


Ответы (5)


Если ваше приложение основано на OSGi, вы можете позволить OSGi обрабатывать пакеты обновлений за вас. Он похож на предлагаемый вами подход с оберткой, поскольку сам контейнер OSGi является «оберткой», и некоторые его элементы не будут обновляться. Здесь обсуждается это

person Miquel    schedule 20.04.2012
comment
Хорошая мысль. Я рассматривал OSGi, но нужно учитывать ограничение ресурсов. Контейнеры OSGi, которые я опробовал, имеют значительные объемы памяти, даже если для них не развернуты какие-либо пакеты. Однако я был бы счастлив, если меня поправят по этому поводу. - person Ryan Stewart; 21.04.2012
comment
Еще один ресурс, который следует учитывать, - это ваше время. OSGi чрезвычайно агрессивно влияет на архитектуру вашего приложения, и на изучение правил загрузки классов может потребоваться время. Все в порядке, когда вы готовы к работе (и если кто-то внедрит обновление, это прекрасно!), Но не думайте, что это займет целый день. - person Dan Gravell; 14.06.2012

Другое решение: используйте (и платите за) install4j. Ознакомьтесь с функциями автоматического обновления здесь

person Miquel    schedule 20.04.2012
comment
Это лучшее, что я когда-либо видел, и которое я почерпнул из другой вопрос, хотя я еще не копал достаточно глубоко, чтобы увидеть, действительно ли он соответствует моим потребностям. - person Ryan Stewart; 21.04.2012

Нет необходимости в оболочке (экономия памяти) или запуске java-сети (добавляет больше ограничений для вашего приложения), просто позвольте потоку в вашем приложении периодически проверять наличие обновлений (например, из облака) и загружать обновления, если они доступны, а затем закодировать эти два вызова в себе применение:

  1. запустите сценарий оболочки (.sh или .cmd) для обновления ваших артефактов и запустите приложение после паузы в несколько секунд в сценарии (чтобы избежать одновременного использования двух экземпляров вашего приложения).
  2. Прекратите ваше приложение (первый экземпляр)

Сценарий может перезаписать необходимые артефакты и повторно запустить ваше приложение.

Наслаждайтесь !

person Amr Lotfy    schedule 18.06.2015

Взгляните на Java Web Start.

Это технология, которая была частью Java с ... 1.5? может 1,4? и позволяет развертывать и устанавливать автономные приложения на основе Java через веб-браузер. Это также позволяет вам всегда запускать последнюю версию приложения.

http://www.oracle.com/technetwork/java/javase/overview-137531.html

http://en.wikipedia.org/wiki/JNLP#Java_Network_Launching_Protocol_.28JNLP.29

также см. этот вопрос: Как лучше всего добавить функцию самообновления в приложение Java Swing?

person Cheeso    schedule 20.04.2012
comment
Мне жаль. Я хотел прояснить, что это безголовые серверы, а приложение работает как фоновый демон. Это не рабочие станции. У них нет среды рабочего стола, а тем более браузера с поддержкой Web Start. Я посетил Web Start, но пришел к выводу, что он предназначен для доставки приложения пользователю. Это должно быть полностью автоматизировано и без присмотра. Я обновлю свой вопрос, чтобы прояснить это. - person Ryan Stewart; 20.04.2012
comment
Веб-запуск можно вызвать из командной строки (не требует браузера) с помощью команды javaws: docs.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/ - person Mark O'Connor; 21.04.2012
comment
Я не уверен, но думаю, что нет способа предотвратить всплывающее окно безопасности при использовании javaws, даже из командной строки. Java Web Start становится невыгодным для людей, желающих развертывать приложения Java без оплаты доверенного сертификата безопасности или незаметно обновлять существующие приложения Java. - person Andy; 12.11.2013

Похоже, что Webstart является только встроенный способ сделать это на данный момент.

person Amir Afghani    schedule 20.04.2012
comment
См. Мой комментарий к другому ответу Web Start. - person Ryan Stewart; 20.04.2012
comment
Это был не я, но я полагаю, это потому, что Webstart не является решением вопроса. - person Ryan Stewart; 20.04.2012
comment
Судя по тому, что вы ищете, я думаю, вы правы. Важно ли для вас делать это «нейтрально с точки зрения платформы»? - person Amir Afghani; 21.04.2012
comment
да. Мы уже развернуты на серверах Windows и RHEL. Я добавлю это к дополнительным соображениям. - person Ryan Stewart; 21.04.2012
comment
Это сделает его «трудным». Вам нужно будет опросить какой-то сервер обновлений, загрузить последнюю версию и иметь механизм для выключения и перезапуска демона. - person Amir Afghani; 21.04.2012
comment
Ну да. Если вы прочитаете среднюю часть моего Предлагаемого решения, то увидите, что это именно то, что я уже прототипировал. Я прошу сообщества поделиться передовым опытом, советами, вспомогательными фреймворками и т. Д., Потому что для меня это новая территория. - person Ryan Stewart; 21.04.2012