Статьи

OSGi & Servlets: гибкость благодаря простоте

Как ни странно , простые вещи имеют тенденцию быть более гибкими, чем сложные вещи. Могу поспорить, вы тоже видели, как люди идут на все, чтобы определенное решение обеспечивало максимальную гибкость. Часто такая гибкость не требуется, поэтому вы вводите случайную сложность.

В недавнем посте я показал вам, как создать простой сервлет и зарегистрировать его в среде OSGi. Как указали и Джефф, и Скотт , использование ServiceTracker для регистрации и отмены регистрации сервлета немного неуклюже и может быть улучшено с помощью декларативных служб.

Я настоятельно рекомендую прочитать главу 15 « OSGi и Equinox », но в двух словах декларативные сервисы позволяют вам определять компоненты, которые могут предоставлять и использовать сервисы. Связывание и открепление ссылок между компонентами и службами выполняется средой выполнения DS (также известной как среда выполнения компонентов службы).

Без лишних слов, вот изменения, которые я должен был внести в DS-ify, мой простой сервлет:

  1. Удалить активатор. Да, это правда: нам больше не нужен Активатор. Удалить класс, а также удалить его из META-INF / MANIFEST.MF
  2. Удалить HttpServiceTracker . Регистрация сервлета в HTTPService будет обрабатываться средой выполнения DS.
  3. Реализуйте компонент для регистрации и отмены регистрации сервлета с помощью HttpService :
    public class SimpleComponent {
    private static final String SERVLET_ALIAS = "/hellods";
    private HttpService httpService;

    public void setHttpService(HttpService httpService) {
    this.httpService = httpService;
    }

    protected void startup() {
    try {
    System.out.println("Staring up sevlet at " + SERVLET_ALIAS);
    SimpleServlet servlet = new SimpleServlet();
    httpService.registerServlet(SERVLET_ALIAS, servlet, null, null);
    } catch (ServletException e) {
    e.printStackTrace();
    } catch (NamespaceException e) {
    e.printStackTrace();
    }
    }

    protected void shutdown() {
    httpService.unregister(SERVLET_ALIAS);
    }
    }

    Как вы можете видеть, HttpService будет внедрен в этот компонент, используя его метод установки, setHttpService .

  4. Зарегистрируйте этот компонент во время выполнения DS, добавив описание компонента:
    <?xml version="1.0" encoding="UTF-8"?>
    <scr:component
    xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"
    activate="startup"
    deactivate="shutdown"
    name="simple.ds.component">
    <implementation
    class="simple.ds.servlet.SimpleComponent"/>
    <reference
    bind="setHttpService"
    interface="org.osgi.service.http.HttpService"/>
    </scr:component>

    I saved this file in OSGI-INF/component.xml and added it to the Service-Component section of META-INF/MANIFEST.MF. In fact, as I used the Create New OSGi Component wizard, the wizard added the entry to the ServiceComponent section — it’s really easy to forget this if you do it manually!

That’s it!

Please note that I did not change the servlet implementation at all (apart form issuing a different text to make it easier to tell the servlets apart)!

Before launching, please make sure to add org.eclipse.equinox.ds and org.eclipse.equinox.util to your launch config to enable Declarative Services.

The biggest advantage of this approach is that you do not have to take care of acquiring the HTTPService. The DS runtime will only activate your component when all prerequisites have been met, i.e., all dependencies are available. If the HttpService is not available for any reason, your component will not be started. This makes the code for registering the servlet simpler and cleaner.

You can download the source for the DS-ified servlet from my SVN repository on Google Code.

 

From http://www.peterfriese.de/osgi-servlets-flexibility-by-simplicity/