Порядок инициализации компонента OSGI с опциональной жадностью - PullRequest
0 голосов
/ 18 сентября 2018

Я использую Osgi DS (в среде AEM).

У меня есть служба A , предоставляемая компонентом AImpl , которая может, но не должнабыть активным (это зависит от наличия его конфигурации).

Некоторые системы имеют его, а другие нет, но он предопределен и известен во время загрузки.

Теперь у меня есть другие компоненты (скажем, BImpl ), которые по выбору могут использовать его сСсылочный тип STATIC, OPTIONAL, GREEDY.

Теперь, как я могу гарантировать, что Bimpl получит его в системах, где он активен, когда он впервые инициализируется во время загрузки.Другими словами, как я могу гарантировать, что BImpl всегда будет инициализироваться после AImpl в системах, где AImpl должен быть активным?

I wanчтобы избежать ситуации, когда нет жесткой зависимости init между BImpl и AImpl и BImpl сначала инициализируется, а затем перезапускается при AImpl наконец активируется во время загрузки.

Если возможно, я бы хотел избежать использования начальных уровней (использование не начального уровня по умолчанию обычно не рекомендуется для компонентов уровня пользователя в AEM).

1 Ответ

0 голосов
/ 24 сентября 2018

Здесь есть три основных варианта:

  1. Не беспокойся об этом. Тот факт, что ваш BImpl имеет статическую жадную ссылку , означает, что при регистрации AImpl в него будет добавлен BImpl, даже если это означает уничтожение и повторную инициализацию компонента BImpl. Вот как все должно работать со статическими ссылками, и это именно то, что произойдет, если AImpl был незарегистрирован / обновлен.

  2. Можно ли сделать так, чтобы компонент BImpl имел требуемую конфигурацию? Если это возможно, вы можете использовать эту конфигурацию для изменения минимальной мощности ссылки AImpl с нуля на единицу. Это сделало бы его обязательной ссылкой и гарантировало, что ваш BImpl не запускается до тех пор, пока не будет доступен AImpl. Конфигурация для минимального количества элементов справочной информации определена в спецификации и может быть установлена ​​динамически с помощью Configuration Admin.

  3. Как 2, но создайте APrimeImpl, который реализует A с заглушенной реализацией и имеет требуемую конфигурацию. Используйте эту конфигурацию, чтобы активировать заглушку A (или нет), а затем заставить BImpl (и все реализации) использовать обязательную ссылку для A. Таким образом, у вас есть только одна конфигурация, которую нужно изменить, чтобы заставить всех использовать настоящий AImpl. С другой стороны, вы теряете возможность делать некоторые ссылки обязательными, а другие необязательными.

Вариант 1 определенно самый простой, и я обычно рекомендую его людям.

...