2013-05-01 6 views
8

Я хочу создать и развернуть веб-службу в контейнере OSGi. Например, опубликуйте услугу по адресу:Как использовать сервлет с osgi

http://localhost:8080/testservice. 

Служба генерирует ответ HTML в сервлете.

Я искал много и получил:

public class HelloWorldServlet extends HttpServlet { 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("text/html"); 
    PrintWriter out = response.getWriter(); 

    out.println("<html>"); 
    out.println("<head>"); 
    out.println("<title>Hola</title>"); 
    out.println("</head>"); 
    out.println("<body bgcolor=\"white\">"); 
    out.println("</body>"); 
    out.println("</html>"); 
} 

}

инструмент, который я должен использовать:

  1. Maven для создания проекта

  2. Fuse ESB karaf в качестве контейнера OSGi

Вопрос заключается в том, что я не знаю, как использовать Maven для создания и реализации такой веб-службы, как:

как указать веб-приложение/web.xml

как указать pom.xml: зависимости, тип пакета, плагин

как зарегистрировать услугу: осуществлять BundlActivator или настроить пружинный XML-файл

Может кто-нибудь помочь мне с этим? Есть ли подробный учебник для новичков?

+0

В моем примере https://github.com/bdelacretaz/OSGi-for-mere-mortals представлены простые, но полные приложения на основе OSGi, в которых используется несколько сервлетов , Он не использует Apache Karaf в своем контейнере, но должен помочь вам понять, как это работает в целом. –

ответ

4

Если вы используете bndtools, создать проект декларативных служб и добавить аннотацию к сервлет:

@Component(provide = Servlet.class, properties = {"alias=/hello"}) 
public class HelloWorldServlet extends HttpServlet { ... } 

Затем создайте BND дескриптор запуска с ' Apache Felix 4 с веб-консолью и Gogo ', просто добавьте пакет доски Apache Felix Http, и вам будет хорошо. Вы можете найти свой сервлет на http://localhost:8080/hello

Как это работает. Аннотация @Component делает ваш класс сервисом (сервис Servlet в этом случае из-за атрибута обеспечения). Это зарегистрировано в свойстве «псевдоним» службы. Комплект Apache Felix Http Whiteboard подбирает эти сервисы и регистрирует их как сервлеты. Я не думаю, что это может быть проще, чем это.

+0

Достаточно ли @Compoment? Я всегда думал, что сервлет должен быть объявлен как \ @Service. – ilikeorangutans

+0

Мне нужно использовать FUSE ESB Enterprise. Невозможно переключиться на Apache Felix. Является ли Apache Felix похожим на Apache Karaf? –

+0

@ilikeorangutans Да, этого достаточно. Обратите внимание на атрибут «обеспечить = сервлет.класса». –

1

Вы можете найти следующую полезную инструкцию: http://www.javabeat.net/2011/11/writing-an-osgi-web-application/. Он основан на второй главе Enterprise OSGi in Action. В восьмой главе также обсуждается, как использовать инструменты построения, такие как maven, для получения правильной структуры пакета, а http://coding.alasdair.info/2011/01/creating-web-application-bundle-using.html также имеет действительно полезные инструкции maven.

На высоком уровне ваш лучший маршрут, вероятно, поможет чему-то вроде Apache Aries или Eclipse Gemini, чтобы вы могли запускать WAB (веб-узел). WAB структурирован почти так же, как WAR, за исключением того, что в манифесте есть метаданные OSGi. Ваш класс сервлета будет идентичен случаю, отличному от OSGi. Рамки будут обрабатывать обнаружение и запуск вашего сервлета.

0

Чтобы ответить на ваш вопрос, так как Karaf (FUSE ESB) использует Pax Web, как это принять по умолчанию Web-Container посмотреть на Pax Web для получения более подробной информации, как это работает, и, вероятно, лучше всего для вас на более чем 100 integration tests Пакс Web в дать вам идею о том, как ее использовать. Есть также samples, чтобы показать вам, как использовать либо std. Http-Service, через доску-расширитель или как WAR/WAB.

0

Я думаю, вам нужен сервлет-мост для доступа к сервису. Ваш сервис должен быть реализован в виде пакета OSGI; сервлет-мост должен иметь встроенную инфраструктуру OSGI. Следуйте этому образцу для получения более подробной информации: http://vbashur.blogspot.kr/2014/07/osgi-servlet-bridge-sample.html

2

Я хотел бы следить за ответом Peter Kriens. С @Component аннотаций доступны в спецификации OSGi, пример может выглядеть следующим образом:

@Component(service = Servlet.class, property = { "osgi.http.whiteboard.servlet.pattern = /hello" }) 
public class HelloWorldServlet extends HttpServlet { ... } 

@Component аннотацию импортируется из org.osgi.service.component и свойство, которое указывает реализованный сервис изменила свое название на service.

Несмотря на свое название, property может содержать несколько свойств, например

@Component(service = ..., property = { "a=b", "c=d" }) 

или вы могли бы использовать properties указать один или несколько файлов свойств следующим образом:

@Component(service = ..., properties = { "OSGI-INF/servlet.properties" }) 

Выше был протестирован HttpService, который поставляется с Apache Felix. Документацию HTTP-службы Apache Felix можно найти здесь: http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html

Смежные вопросы