Данную заметку можно рассматривать как продолжение предыдущей - О любви и дружбе между сервлетами и OSGi. Рассмотрим еще один способ регистрации сервлета в OSGi-контейнере - использование декларативных сервисов.
Использование декларативных сервисов обеспечивает следующее преимущество по сравнению с использованием точек расширения и сервис-трекера: OSGi контейнер в этом случае сам управляет жизненным циклом бандла. Имеется ввиду следующее: в декларативном сервисе определяются методы регистрации зависимостей и старта/останова сервиса. Пока все зависимости не будут удовлетворены - сервис не будет запущен. Таким образом гарантируется, что в момент запуска декларативного сервиса регистрации сервлета, сервис HttpService будет доступен. Данное обстоятельство позволяет существенно упростить код регистрации сервлета, сделать его короче и понятнее. К тому же, в случае использования декларативных сервисов, нам не нужен активатор бандла.
Давайте создадим бандл name.samolisov.servlet.ds, в манифесте которого не будем указывать активатор. Поместим в данный бандл сервлет из предыдущего примера - WelcomeServlet. Создадим компонент - декларативный сервис, в котором будет регистрироваться данный сервлет. Код компонента следующий:
package name.samolisov.servlet.ds;
import javax.servlet.ServletException;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.NamespaceException;
public class WelcomeServletComponent
{
private static final String SERVLET_PATH = "/welcome";
private HttpService _httpService;
public void bindHttpService(HttpService httpService)
{
_httpService = httpService;
}
protected void register()
{
try
{
System.out.println("Staring up sevlet at " + SERVLET_PATH);
_httpService.registerServlet(SERVLET_PATH, new WelcomeServlet(), null, null);
}
catch (ServletException e)
{
e.printStackTrace();
}
catch (NamespaceException e)
{
e.printStackTrace();
}
}
protected void unregister()
{
_httpService.unregister(SERVLET_PATH);
}
}
import javax.servlet.ServletException;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.NamespaceException;
public class WelcomeServletComponent
{
private static final String SERVLET_PATH = "/welcome";
private HttpService _httpService;
public void bindHttpService(HttpService httpService)
{
_httpService = httpService;
}
protected void register()
{
try
{
System.out.println("Staring up sevlet at " + SERVLET_PATH);
_httpService.registerServlet(SERVLET_PATH, new WelcomeServlet(), null, null);
}
catch (ServletException e)
{
e.printStackTrace();
}
catch (NamespaceException e)
{
e.printStackTrace();
}
}
protected void unregister()
{
_httpService.unregister(SERVLET_PATH);
}
}
Стоит заметить, что в данном случае мы не запускаем сервлет-контейнер (например, Jetty) из бандла. Сервлет-контейнер будет запущен, если в конфигурации запуска указать бандлу org.eclipse.equinox.http.jetty значение параметра Auto-Start равное true. Чтобы задать нужный порт, который будет слушать Jetty - необходимо в параметры виртуальной машины добавить значение -Dorg.eclipse.equinox.http.jetty.http.port=8080 (в данном случае активным будет порт 8080).
Данный компонент необходимо описать. Для этого нужно создать файл OSGI-INF/servlet.xml следующего содержания:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"
activate="register"
deactivate="unregister"
name="name.samolisov.servlet.ds">
<implementation class="name.samolisov.servlet.ds.WelcomeServletComponent"/>
<reference
bind="bindHttpService"
interface="org.osgi.service.http.HttpService" />
</scr:component>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"
activate="register"
deactivate="unregister"
name="name.samolisov.servlet.ds">
<implementation class="name.samolisov.servlet.ds.WelcomeServletComponent"/>
<reference
bind="bindHttpService"
interface="org.osgi.service.http.HttpService" />
</scr:component>
В свою очередь данный файл необходимо прописать в манифесте бандла:
Service-Component: OSGI-INF/servlet.xml
В конфигурации запуска нужно выбрать следующие бандлы:
- name.samolisov.servlet.ds (Auto-Start: true)
- javax.servlet
- org.eclipse.equinox.ds (Auto-Start: true)
- org.eclipse.equinox.http.jetty (Auto-Start: true)
- org.eclipse.equinox.http.servlet
- org.eclipse.equinox.util
- org.eclipse.osgi
- org.eclipse.osgi.services
- org.mortbay.jetty.server
- org.mortbay.jetty.util
Добавились бандлы org.eclipse.equinox.util и org.eclipse.equinox.ds, которые предоставляют подсистему декларативных сервисов.
В следующей заметке постараюсь рассказать о запуске сервлетов на контейнерах, отличных от Jetty. Оставайтесь на связи!
Понравилось сообщение - подпишитесь на блог или читайте меня в twitter
2 комментария:
Здравствуйте. Хотелось бы спросить, в каком редакторе вы подготавливаете листинги XML-файлов, чтобы выкладывать в этом блоге? Примитивные тэги HTML "code" и "pre" полностью экранируют/скрывают XML-разметку и непригодны к оформлению здесь.
Здравствуйте, я пользуюсь вот этим сайтом: http://quickhighlighter.com/
Отправить комментарий
Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!