Как создать несколько сервисов OSGi? - PullRequest
1 голос
/ 13 апреля 2011

В контексте приложения Eclipse RCP я решил использовать службы OSGi для предоставления «Интерфейсов» из плагина (то есть пакета).

В одном из моих плагинов у меня есть следующий интерфейс Parser:

public interface Parser {

    public void start(File file);

    public boolean hasNext();

    public Object next();
}

Потребительские плагины будут использовать этот интерфейс для разбора файлов. Поскольку несколько разборов могут выполняться одновременно, а реализация этого интерфейса потребует нескольких закрытых полей «состояние», каждый потребитель этой службы должен использовать выделенный экземпляр службы.

В этом случае решение по умолчанию, предоставленное руководствами по OSGi, состоящим в регистрации ОДНОГО экземпляра службы в методе запуска пакета анализатора, не работает. Как лучше всего справиться с таким решением? Я могу создать сервис ParserFactory одним уникальным методом:

public Parser create(File file);

??

Любой комментарий приветствуется,

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

Как вы предлагаете, я бы изменил ваш сервисный интерфейс на провайдера Parser.

А ваш парсер просто итератор, так что, может быть, что-то вроде

public interface ParserFactory<T> {

  /** Iterating on the returned object
   *  provides Ts parsed from the InputStream.
   *
   *  @param input must be closed by the returned object 
   *   when done iterating. 
   */
  Iterable<T> createParser(InputStream input);
}

Использование InputStream или Reader также делает его более гибким, чем файл.

2 голосов
/ 13 апреля 2011

Посмотрите на OSGi ServiceFactory ; это позволяет создавать экземпляры служб для разных запрашивающих пакетов. Подробнее об этом вы можете прочитать в разделе 5.6 основной спецификации.

...