Обновлять OSGi-комплект при запуске - PullRequest
5 голосов
/ 07 октября 2010

У меня есть несколько пакетов OSGi, каждый из которых можно обновить из репозитория пакетов OSGi.Когда я запускаю свою платформу OSGi (Apache Felix), я хочу, чтобы первый пакет запускался и проверял обновления для всех установленных пакетов.Если доступны обновления, следует обновить каждое из них (включая себя), а затем продолжить запуск (или, возможно, выключение, и ОС перезапустит приложение).

Как это лучше всего сделать в соответствии с OSGi?1003 *

Как должен обновляться первый пакет?Может ли он обновляться сам при запуске?

Ответы [ 2 ]

4 голосов
/ 10 декабря 2010

Есть пара вещей, которые вы должны сделать:

  1. Убедитесь, что у вас есть один пакет («агент управления», как его часто называют в спецификации), который запускается первым при запуске инфраструктуры (пере), давая ему более низкий начальный уровень, чем у всех ваших других пакетов. Также убедитесь, что система запускается с начального уровня, равного уровню агента управления. Таким образом, этот пакет сможет обновить все остальные пакеты до того, как они начнут действовать. Только после того, как агент управления завершит обновление, он обновит все пакеты и перейдет на следующий начальный уровень, эффективно запустив все остальные пакеты.

  2. Чтобы обновить агент управления, лучше всего временно установить второй пакет, который фактически выполняет обновление. Порождение потоков в агенте управления - не лучшее решение, поскольку эти потоки не должны продолжать работать после остановки пакета и его несоблюдения, что может привести к проблемам, которые трудно решить. Этот второй пакет будет фактически обновлен и, возможно, даже откатится, если обновление завершится неудачей.

Пример агента управления, который может обновлять себя, можно найти как часть Apache ACE. У него есть агент, который из кода установит второй пакет, чтобы обновить себя из удаленного местоположения. Некоторые ссылки на соответствующие части этого проекта:

2 голосов
/ 11 октября 2010

Вы можете взглянуть на диаграмму состояний в OSGi Core Spec (это должно быть Рис.28).Там вы можете увидеть, что пакет в состоянии STARTING может перейти только в состояние ACTIVE (за исключением случаев, когда выдается исключение).Пакет может быть обновлен только тогда, когда он находится в состоянии INSTALLED или RESOLVED.Для этого он должен быть остановлен, если он находится в состоянии ACTIVE.

Проблема в том, что вы не можете остановить пакет, когда он находится в состоянии STARTING.И пока выполняется метод start () Activators, пакет все еще находится в состоянии STARTING, а не ACTIVE.

Что вы можете сделать, это запустить поток в Bundle, который проверяет его состояние на ACTIVE, а затем вызватьметод update ().Но не забудьте прекратить поток, иначе сборщик мусора не сможет освободить ресурсы из файла JAR текущего пакета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...