Взаимодействие Non osgi с пучками osgi
Я использую Struts2 для своего веб-приложения, и я хочу использовать архитектуру OSGI для сервиса и дао слоя. Теперь я не хочу оборачивать свои движения struts2 как пакеты osgi, но хочу, чтобы сервис и слой dao были упакованы как пакеты. Теперь кто-нибудь может сказать мне, как мои действия без osgi могут потреблять пакеты osgi (сервис и слой дао). И я хочу развернуть свое веб-приложение struts2 в веб-контейнере, чтобы в этом случае веб-контейнер взаимодействовал с контейнером osgi (где развернут мой сервис и dao). Пожалуйста помоги.
2 ответа
Вам нужен так называемый "мост" между вашим веб-контейнером и средой OSGi. И Felix, и Equinox имеют такую возможность, но для меня реализация Felix работала намного лучше.
Что вы в основном хотите сделать, это:
- Добавьте прослушиватель контекста к вашему ServletContext
- Запуская OSGi при запуске ServletContext, остановите его, когда ServletContext будет уничтожен.
- Передайте ServletContext в контекст OSGi, зарегистрировав его как сервис
- Сохраните объект инфраструктуры OSGi в ServletContext, зарегистрировав его в качестве атрибута.
Итак, чтобы получить доступ к веб-контексту из OSGi: получите сервис ServletContext и перейдите оттуда.
Чтобы получить доступ к OSGi из веб-контекста: Извлеките инфраструктуру OSGi из атрибута ServletContext и перейдите оттуда.
Посмотрите документацию Феликса, также я недавно сделал пример на GitHub
Наверняка это не сработает. Как вы думаете, почему стоит переместить половину вашего приложения в OSGi? Либо вы должны переместить все это или ни одного.
Возможно, вы сможете развернуть слой Struts в файле war и получить к нему доступ к службам OSGi. Я думаю, что это возможно в Деве и Апаче Карафе. Это означает усиление войны со структурами OSGi. Например, в Karaf вы можете использовать wab-файл, который является военным файлом с манифестом.