Как получить доступ к службе (Blueprint) OSGi из развернутого веб-пакета Pax Web?

В настоящее время я использую Pax Web для развертывания пакета веб-приложений OSGi. Из этого веб-пакета мне нужен доступ к набору сервисов OSGi. В остальной части системы я использую Blueprint для создания и использования сервисов. Это здорово, так как обеспечивает прокси, демпфирование и т. Д.

Как лучше всего получить доступ к этим сервисам OSGi из пакета развернутых веб-приложений Pax Web?

Мои мысли

1) Получите BundleContext из ServletContext через атрибут osgi-bundlecontext, а затем используйте класс OSGi ServiceTracker.

2) Создайте файл контекста Blueprint в веб-комплекте, который содержит ссылки на нужные мне сервисы. Контекст Blueprint регистрируется в реестре службы OSGi расширителем Blueprint, из которого я могу получить его, а затем искать компоненты по идентификатору.

3) Создайте контекст Blueprint в файле web.xml, используя что-то вроде Springs ContextLoaderListener.

Вариант 1 хорош, но означает, что я должен отслеживать сервисы и не получать никаких преимуществ от Blueprint.

Вариант 2 тоже работает отлично, за исключением того, что он страдает от проблем со временем По сути, в настоящее время есть две службы, развертывающие приложение: расширитель Pax Web, развертывающий с помощью файла web.xml, и (в моем случае, Gemini) расширитель Blueprint, развертывающий файлы контекста Blueprint. При запуске эти расширители развертываются одновременно, и нет никакой гарантии, что контекст приложения будет доступен в реестре службы OSGi, когда веб-расширитель Pax создает экземпляры прослушивателей контекста сервлета. Это означает, что службы OSGi нельзя вызывать из кода прослушивателя контекста.

Вариант 3 - не слишком уверен, что это можно сделать. Похоже, Spring DM использовал этот подход?

Я чувствую, что что-то упустил - есть ли простой способ использовать Blueprint из развернутого веб-пакета Pax Web?

1 ответ

Да, вам не хватает другого, который будет работать. Используйте jndi в качестве бриджа. При использовании Овна (хотя я не знаю о Близнецах), вы можете получить любой сервис OSGi также как поиск jndi. Теперь получите это через web.xml, и все будет в порядке.

Например использовать

osgi:service/<interface>[/<filter>]

как ваш jndi-источник из вашего web.xml Преимущество этого заключается в том, что вы не столкнетесь с проблемами #2 в отношении #3, которые нельзя сделать прямо сейчас. Так что в основном у вас все еще есть выбор 3, но я бы предложил использовать #4

Другие вопросы по тегам