Особенность OSGI Установка работает, но пакеты все еще установлены

StackOverflow https://stackoverflow.com/questions/4540414

Вопрос

РЕДАКТИРОВАТЬ: Обновил этот вопрос с последней информацией ...

У меня есть проблемы, бегущие на спине «Функции: удаление» команды для зависимых функций. Осги отвечает «изменение государства в прогрессе ...», но, принимая другие запросы, мы сталкиваемся с проблемами.

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

Как предполагалось, я также попытался добавить «OSGI: обновить» между шагами ... одно и то же поведение. Есть ли другой способ обнаружить, что «обновление пакетов» все еще работает, чтобы задержать последующие запросы и т. Д.?

Вот подробности ...

karaf@root> Особенности: удалить политику
karaf@root> функции: удалить политику1
karaf@root> функции: удалить политику2
Изменение состояния в процессе пакета "файл: /policy2.jar" по потоке "обновления пакеты".
karaf@root> Особенности: удалить политику3
Изменение состояния в процессе пакета "файл: /policy3.jar" по потоке "обновления пакеты".
karaf@root> Особенности: удалить политику4
karaf@root> Особенности: удалить Enabler1
Изменение состояния в процессе пакета «файл:/enabler1.jar» по потоке «обновления пакеты».
karaf@root> Особенности: удаление Enabler2
Изменение состояния в процессе пакета «файл:/enabler2.jar» по потоке «обновления пакеты».

После этого ... в итоге мы получим, не установленные (правильно), но некоторые пакеты все еще установлены (неверно)

Осги: список

277] [установлено] [] [] [60] Политика2
278] [установлено] [] [] [60] Политика3
280] [установлено] [] [] [60] Enabler1
281] [установлено] [] [] [60] Enabler2

Особенности: список

Не установилось] [1.0] PolicyUtil Repo-0
Не установилось] [1.0] Policy1 Repo-0
Не установилось] [1.0] Police2 Repo-0
Не установилось] [1.0] Policy3 Repo-0
Не установил] [1.0] Enabler1 Repo-0
Не установил] [1.0] Enabler2 Repo-0

Это было полезно?

Решение 3

Хорошо, я копался в этом, и я думаю, что понимаю проблему и варианты ... спасибо за ответы.

Когда «функции: удаление [имя]» выполняется, он вызывает Bundle.uninstall (), затем обновляйте () для каждого пакета в функциях. Затем, после того, как все пучки удаляются, он вызывает обновление () для всех пучков. Проблема в том, что обновление () асинхронно (согласно Osgi Spec) и оставляет пучки в разрешении состояния. Последующие запросы на удаление разрешения функций/пакетов не завершаются, как и ожидалось.

Если между удалением есть достаточная задержка, или если выполнен более поздний удаление (после завершения обновления () ()) ... все работает как ожидалось.

Опции...

  1. Особенности/пакеты в зависимости от порядок во время удаления (трудно контролировать)
  2. Положите задержку между командами удаления (не точнее)
  3. Убедитесь, что ожидаемые функции/пакеты удаляются (или продолжайте ожидание)
  4. Слушайте события Frameworkevent.packages_Refreshed (сложные и не гарантированные, потому что события широко распространены, см. этот пример)
  5. Измените Karaf/Felix, чтобы поддержать опцию для синхронно освежающих пакетов (см. Эта проблема/разрешение для Карафа 2.1.3)

Другие советы

Я не уверен, какое исключение вы получите, но вы должны знать об одном: когда вы удалите пакет, используя команду оболочки, как osgi:uninstall, вы эффективно звоните Bundle.uninstall(). Анкет Как вы можете прочитать в Javadoc, это не вся история.

Фреймворк способствует операциям, которые оказывают минимальное влияние на остальную часть структуры, поэтому он может удалить пакет без Удаление всех связанных пакетов. Если вы действительно хотите удалить их все, вы должны использовать osgi:refresh командование Для получения дополнительной информации об этом см. FELIX FAQ.

Лучший совет, который я могу дать, - не выпускать множественные uninstall запросы, которые могут пересечь друг друга. Если вы хотите удалить набор пучков, я бы сбросил некресс uninstall() запросы, за которыми следуют один refreshPackages(). Анкет Кроме того, я бы не стал смешивать управление пучками, используя «обычную» консоль и караф в одной системе.

Вы также можете рассмотреть возможность использования внешнего диспетчера для установки и удаления пучков. Если вы хотите удаленное управление, вы можете пойти на Apache Ace (Раскрытие: я комитет Apache Ace).

Ор ... вы можете просто удалить свое приложение с помощью этой команды:

Караф 2.2.x:

osgi: uninstall--force yourappe-feature/0.0.1.snapshot

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

Посмотрите и убедитесь, что все ссылки удалены. Распространенной ошибкой также все еще запускается поток в одном из объектов, созданных в пакете. Это также считается ресурсом, все еще используемым рекламой, который не может быть удален.

В моем случае я удалил эту функцию и заметил номера подвесных пачек, а затем выключил Караф (3.x). Затем я удалил подпапки папки [karaf-install]/data/cache/[wanging-bundle-number]. Теперь я перезапускаю Караф и войны с пучками, не показанные в пакете: список.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top