2009-12-16 4 views
18

Я ищу наилучшую практику закрытия контейнера OSGi.Лучший способ выключения контейнера OSGi (в частности, равноденствия)

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

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

Благодаря

ответ

21

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

Спецификация OSGi определяет следующее (Core Specification, R4.x, 4.2.6 Stop of the Framework).

Завершение работы можно инициировать, остановив системный пакет, [...] или вызывая метод stop на объекте фреймворка.

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

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

Расслоение система напоминает рамочный объект, когда основа запускается, но реализации не требуется использовать один и тот же объект для каркаса объекта и системы расслоение. Однако оба объекта должны иметь идентификатор связки id 0, одинаковое местоположение и символическое имя пакета.

Спектр OSGi можно приобрести бесплатно на сайте OSGi Alliance (http://www.osgi.org/Specifications/HomePage).

4

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

Я никогда не беспокоился о выключении пула в моем приложении, так как нет сохраненного состояния.

0

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

С уважением,

Leen Toelen

+0

Стандартный способ до сих пор это то, что я описал в своем ответе. Это поведение, указанное в спецификациях OSGi, также в следующей версии 4.2. Следующий выпуск (4.2.) будет включать в себя * необязательный * Start Level Service, который может использоваться для управления начальным уровнем пакетов (и структуры). – akr

7

я обычно прекращает структуры, как это:

bundlecontext.getBundle(0).stop();

сверток с идентификатором = 0 системообразующий Bundle