Стратегия обновления приложений OSGi - PullRequest
2 голосов
/ 16 февраля 2011

Каковы подходящие механизмы для исправления контейнера OSGi.

      1) Should the bundles (binaries/jars) have the same name as the old ones then:
            a.  Replace the bundle with the with the new bundle (manifest has been  
              modified to reflect the new version) in the plug-ins folder and,  
            b.  Invoke update <bundle id> <bundle name>.
      2) Or Should the bundles have version information encoded in the file name   
            a.  Copy the new bundle to the plug-ins folder
            b.  Invoke update <bundle id> file:plugins/<new Bundle name>
      3) Or other alternatives, possibly an OBR (not sure of the pros and cons) also 
         we may be constrained by the amount of work involved in retrofitting an OBR.  

Одна вещь, которую я заметил, - это то, что в некоторых случаях файл комплекта (выглядит как переименованный jar) создается под «корнем данных»'конкретного комплекта.Если это произойдет во всех случаях, когда выполняется обновление, или только в определенных случаях.

Существуют ли какие-либо рекомендации, плюсы, минусы и т. Д. По поводу вышеизложенного.Или есть лучшая альтернатива?По сути, я думаю, что было бы неплохо заменить оригинальные двоичные файлы исправленными двоичными файлами, это хорошая идея из контекста OSGi?

Мы используем контейнер Equinox OSGi.

Приветствия,

1 Ответ

1 голос
/ 22 июня 2011

Я бы сам посоветовал вам сделать следующее:

1. Разделите ваш API (Java-интерфейсы) и вашу реализацию на отдельные пакеты.

Таким образом, если только изменения в реализации API поддерживаются "живыми", это предотвращает отключение OSGI-служб. На сервисы ссылается интерфейс. Конечно, ваши потребители услуг должны иметь возможность иметь дело (временно) с несуществующими услугами.

2. Иметь четкую схему именования пакетов.

Я бы использовал версии в имени файла комплекта jar. Вы должны различать банки в файловой системе, и работа с версиями в имени файла очень помогает. Кроме того, если вы не используете версию, я бы беспокоился о перезаписи jar-файлов во время выполнения. Теоретически это должно работать, но вы никогда не знаете. Если у вас есть версии, вы не будете перезаписывать старые банки.

3. Используйте версии в Манифесте.

Кроме того, вы должны использовать свойство version в Manifst. Это, очевидно, меньше для вас, чем для вашего контейнера OSGI, чтобы отслеживать ваши пакеты.


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

Надеюсь, это вам немного поможет. Это хороший вопрос! Может быть, некоторые более опытные люди также разместят там предложения :) Я хотел бы услышать, что делают другие.

...