Я пытаюсь узнать, как работает osgi. Я написал свой первый пакет hello-world, который выводит некоторый консольный вывод, когда выполняется start-метод класса активатора пакета. Теперь я прочитал о механизме ленивого запуска и поместил этот флаг в манифест пакета. затем я запустил консоль равноденствия, установил свой пакет и запустил его. но теперь я ожидал, что мой пакет будет помечен как «стартовый». но вместо этого он уже вызывает метод запуска и помечен как активный. я понял что-то не так с ленивым пусковым механизмом???
вопрос о жизненном цикле пакета osgi
Ответы (2)
Флаг отложенного запуска используется, когда у вас есть другие пакеты, которые зависят от вашего пакета и классов в вашем пакете.
Скажем, у вас есть два набора A и B, где
- A экспортирует класс C
- В зависит от А
- B содержит класс D, который ссылается на C
Что происходит, когда пакет B активирован?
Без флага отложенной загрузки пакет A загружается и активируется первым.
С флагом отложенной загрузки пакет A не загружается и не активируется до тех пор, пока классу D не потребуется обратиться к классу C.
Это может иметь очень большое значение в профиле активации, так как загрузка и активация пакетов откладываются, чтобы произойти как можно позже с помощью флага ленивой загрузки, поэтому первоначальный ответ пакета очень быстрый...
Напротив, этот флаг также значительно усложняет анализ времени выполнения методов в B, поскольку это можно перехватить при загрузке и активации пакетов в любое время....
Вы сказали, что уже запустили свой пакет после установки — если вы запустите свой пакет вручную, он активируется независимо от политики ленивой активации.
Согласно спецификации 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 содержит фактическое, семантически эквивалентное место.