вторник, 27 апреля 2010 г.

Сервлеты и OSGi: будь проще и люди к тебе потянутся


Данную заметку можно рассматривать как продолжение предыдущей - О любви и дружбе между сервлетами и 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);

    }

}


Стоит заметить, что в данном случае мы не запускаем сервлет-контейнер (например, 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>

 


В свою очередь данный файл необходимо прописать в манифесте бандла:

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 комментария:

iZEN комментирует...

Здравствуйте. Хотелось бы спросить, в каком редакторе вы подготавливаете листинги XML-файлов, чтобы выкладывать в этом блоге? Примитивные тэги HTML "code" и "pre" полностью экранируют/скрывают XML-разметку и непригодны к оформлению здесь.

Pavel Samolisov комментирует...

Здравствуйте, я пользуюсь вот этим сайтом: http://quickhighlighter.com/

Отправить комментарий

Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!