Лучший способ закрыть OSGi-контейнер (в частности, равноденствие) - PullRequest
19 голосов
/ 16 декабря 2009

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

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

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

Спасибо

Ответы [ 4 ]

22 голосов
/ 17 декабря 2009

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

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

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

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

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

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

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

8 голосов
/ 18 апреля 2013

я обычно завершаю фреймворк так:

bundlecontext.getBundle(0).stop();

Пакет с id = 0 является системным пакетом

4 голосов
/ 16 декабря 2009

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

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

0 голосов
/ 09 февраля 2010

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

С уважением,

Leen Toelen

...