Поиск служб OSGi вне контейнера OSGi

У меня есть набор пакетов, развернутых в Karaf и предоставляющих ряд служб OSGi, которые я хотел бы иметь возможность искать и вызывать удаленно, из приложения, работающего на (возможно) другом компьютере и в контейнере, отличном от OSGi. Сначала я использовал поиск JNDI для получения нужных мне услуг, однако я понимаю из более раннее сообщение stackoverflow о том, что это может не поддерживаться (я говорю, что может, поскольку я не смог найти никакой информации о том, изменилось ли что-либо в реализации Aries JNDI в прошедший год). В этом случае я предполагаю, что моими другими вариантами было бы использование CXF для предоставления JAX-WS или JAX-RS API для моих служб.

Правильно ли я понимаю ситуацию? Действительно ли поиск JNDI не вариант в моем случае? Есть ли другие альтернативы, о которых я не подумал?


person Christina    schedule 23.06.2014    source источник


Ответы (2)


Простой поиск jndi не будет работать. Службы OSGi сами по себе не подходят для удаленного взаимодействия. Таким образом, даже если вы каким-то образом можете получить объект jndi, вы не сможете его вызвать.

Возможные решения — ручные cxf-прокси и конечные точки, как вы уже нашли, и Distributed OSGi. См. CXF-DOSGi и Eclipse ECF. Оба могут предлагать прозрачные сервисные вызовы от одной платформы OSGi к другой. DOSGi идеально подходит, если вы также используете OSGi на стороне клиента. По крайней мере, в случае CXF DOSGi также можно использовать DOSGi на стороне сервера и обычный клиент CXF на стороне клиента. Таким образом, вы можете минимизировать усилия на стороне сервера.

См. также это руководство по CXF DOSGi.

person Christian Schneider    schedule 23.06.2014
comment
Спасибо, Кристиан. Что мне немного неясно, так это то, как я могу подключиться к DOSGi с клиента, отличного от OSGi. Есть ли у вас какие-либо ссылки/примеры, которые могли бы помочь мне в этом? - person Christina; 24.06.2014
comment
Просто экспортируйте сервис обычным способом DOSGi и проверьте сервлет cxf на localhost:8181/cxf. Там вы должны увидеть сервисный URI. - person Christian Schneider; 24.06.2014
comment
Я опубликовал пример службы для DOSGi, как вы предлагаете, и действительно, это похоже на путь, однако я до сих пор не могу понять, почему я могу получить доступ к опубликованной конечной точке только с локального хоста (событие с машины, где конечная точка развернута, я могу получить к ней доступ на localhost:9090/hello?wsdl, но не на http:// ‹мой_ip_адрес›:9090/hello?wsdl). Есть ли конфигурация, которую мне не хватает? - person Christina; 25.06.2014
comment
Как вы определили экспорт? Если вы укажете полный uri как localhost:9090/hello, то он действительно работает только на локальном хосте. Попробуйте использовать путь, например /hello, или укажите свое имя хоста в uri. Я всегда использую вариант /hello, который использует HTTPService OSGi, поэтому все службы используют один и тот же сервлет. - person Christian Schneider; 25.06.2014
comment
Это действительно было проблемой. Я пытался использовать только /hello, но в org.apache.cxf.ws.httpservice.context вместо org.apache.cxf.ws.address. Спасибо за помощь. - person Christina; 26.06.2014

Вам нужна реализация удаленных служб. См. https://en.wikipedia.org/w/index.php?title=OSGi_Specification_Implementations для списка.

person BJ Hargrave    schedule 23.06.2014