Подтвердить что ты не робот

Лучший способ закрыть контейнер OSGi (в частности, равноденствие)

Я ищу наилучшую практику закрытия контейнера OSGi.

В настоящее время мы используем небольшое приложение для запуска, которое вызывает EclipseStarter.startup() и устанавливает некоторые основные пакеты. После этого пусковая установка заканчивается.

Когда тестовый GUI (работает как пакет) закрыт, он вызывает System.exit(0) для выключения контейнера, но должно быть более элегантное решение, чем это.

Спасибо

4b9b3361

Ответ 1

Пожалуйста, не используйте System.exit(0), чтобы закрыть инфраструктуру OSGi. Вы должны сделать это, остановив пакет с идентификатором 0, системным пакетом. Таким образом, вы даете всем связям возможность отключиться упорядоченным образом (например, для освобождения ресурсов и т.д.).

Спецификация OSGi определяет следующее (Core Specification, R4.x, 4.2.6 Остановка рамки).

Выключение может быть инициировано путем остановки системного пакета, [...] или вызова метода stop в объекте framework.

В этой главе дается подробное описание того, что происходит, когда среда закрыта.

Системный пакет соответственно. объект рамки также определен (глава 4.6 "Системный комплект" ):

Системный пакет похож на объект framework при запуске фреймворка, но реализациям не требуется использовать один и тот же объект для объекта framework и системного пакета. Тем не менее, оба объекта должны иметь идентификатор пустого идентификатора 0, того же местоположения и связки.

Спецификация OSGi доступна бесплатно на сайте OSGi Alliance (http://www.osgi.org/Specifications/HomePage).

Ответ 2

i обычно завершает структуру следующим образом:

bundlecontext.getBundle(0).stop();

Расслоение с id = 0 является системным расслоением

Ответ 3

Я также использую Equinox во встроенном контексте приложения, и я вызываю stop() в System Bundle и следую за этим с помощью EclipseStarter.shutdown(). Возможно, вам придется остановить все ваши пакеты.

Я никогда не беспокоился о завершении пакета в моем приложении, так как нет сохраненного состояния.

Ответ 4

Пока нет стандартного способа сделать это. OSGI сделает эту часть своего стандартного api в следующем выпуске, но я полагаю, что это займет некоторое время, прежде чем все контейнеры OSGI реализуют это. Используйте конкретный код контейнера, но держитесь подальше от System.exit().

Привет,

Leen Toelen