вопрос о жизненном цикле пакета osgi

Я пытаюсь узнать, как работает osgi. Я написал свой первый пакет hello-world, который выводит некоторый консольный вывод, когда выполняется start-метод класса активатора пакета. Теперь я прочитал о механизме ленивого запуска и поместил этот флаг в манифест пакета. затем я запустил консоль равноденствия, установил свой пакет и запустил его. но теперь я ожидал, что мой пакет будет помечен как «стартовый». но вместо этого он уже вызывает метод запуска и помечен как активный. я понял что-то не так с ленивым пусковым механизмом???


person Antje Janosch    schedule 16.07.2011    source источник


Ответы (2)


Флаг отложенного запуска используется, когда у вас есть другие пакеты, которые зависят от вашего пакета и классов в вашем пакете.

Скажем, у вас есть два набора A и B, где

  • A экспортирует класс C
  • В зависит от А
  • B содержит класс D, который ссылается на C

Что происходит, когда пакет B активирован?

Без флага отложенной загрузки пакет A загружается и активируется первым.

С флагом отложенной загрузки пакет A не загружается и не активируется до тех пор, пока классу D не потребуется обратиться к классу C.

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

Напротив, этот флаг также значительно усложняет анализ времени выполнения методов в B, поскольку это можно перехватить при загрузке и активации пакетов в любое время....

person Tonny Madsen    schedule 16.07.2011
comment
Большое спасибо вам обоим!!! Это не очень хорошо объяснялось в моей книге, но теперь я это понимаю :-) - person Antje Janosch; 16.07.2011

Вы сказали, что уже запустили свой пакет после установки — если вы запустите свой пакет вручную, он активируется независимо от политики ленивой активации.

Согласно спецификации OSGi для активации верно следующее:

Политика ленивой активации указывает, что однажды запущенный пакет нельзя активировать до тех пор, пока из него не будет загружен класс; либо во время обычной загрузки класса, либо с помощью метода Bundle loadClass. Загрузка ресурсов не вызывает активацию. Это изменение политики нетерпеливой активации по умолчанию отражается в состоянии пакета и его событий. Когда пакет запускается с использованием политики отложенной активации, необходимо выполнить следующие шаги:

  • Bundle Context создается для пакета.
  • Состояние пакета перемещается в состояние НАЧАЛО.
  • Запускается событие LAZY_ACTIVATION.
  • Система ожидает загрузки класса из пакета.
  • Запускается обычное событие STARTING.
  • Пакет активирован.
  • Состояние пакета перемещается в АКТИВНО.
  • Событие STARTED запускается.

Если активация не удалась из-за того, что метод запуска Bundle Activator вызвал исключение, пакет необходимо остановить, не вызывая метод остановки Bundle Activator. Эти шаги изображены на блок-схеме на рис. 4.29. Эта блок-схема также показывает разницу в политике активации для обычной нетерпеливой активации и отложенной активации.

Update: так как я не могу сказать, какую версию спецификации я открывал на момент написания ответа (однако, я полагаю, это была либо 4.2, либо 4.3), я проверил текущую, v5. 0, а раздел 4.4.6.2 содержит фактическое, семантически эквивалентное место.

person Zoltán Ujhelyi    schedule 16.07.2011
comment
Вы должны указать источник спецификации. Спецификация может меняться со временем, и будущие читатели (такие как я) не знают, откуда и из какой версии вы взяли эту цитату. - person Rui Marques; 02.09.2013
comment
Спасибо за комментарий; Я добавил ссылки на спецификацию. - person Zoltán Ujhelyi; 02.09.2013