Как эффективно использовать несколько сервисов, используя ServiceTracker? - PullRequest
1 голос
/ 20 марта 2011

Я бы хотел использовать ServiceTracker для того, чтобы пользоваться услугами, опубликованными нашей компанией. Вместо создания нового ServiceTracker для каждого сервиса, который я хочу использовать, я подумал, что было бы лучше создать только один с фильтром, а затем получить из него сервисы:

Filter filter = ctx.createFilter("(" + Constants.OBJECTCLASS + "=com.mycomp*)");
tracker = new ServiceTracker(ctx, filter, null);

Проблема с этим подходом состоит в том, что мне затем нужно перебрать ссылки на службы, которые обнаружил трекер, исследовать их свойство objectClass и посмотреть, могу ли я присвоить его объекту службы, который очень громоздок и подвержен ошибкам из-за приведения, который требуется.

Есть ли другие идеи, как использовать несколько сервисов более элегантным способом?

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

Я думаю, что это неправильный вопрос :-) Из вопроса я заключаю, что у вас есть метод, который получает сервис от вашей компании, и вы хотите, чтобы этот метод вызывался. То есть где-то в вашем коде вы должны быть проинформированы о конкретном типе com.mycomp.X, то есть вы не заинтересованы в общих услугах вашей компании, у вас есть явная зависимость от типа. В своем вопросе вы предполагаете, что они должны отправляться централизованно, что обычно не является надежным, подверженным ошибкам и горячей точкой обслуживания; каждый раз, когда у вас появляется новый сервис компании, вам необходимо обновить метод отправки.

Гораздо лучшим решением кажется использование декларативных сервисов и использование bndtools с аннотациями. В этой модели каждое место, где вам нужен сервис:

@Component public class SomeMyCompComponent {
  ...
  @Reference
  void foo( com.mycomp.X x ) { ... }
  ...    
}

В этой модели вам не нужно централизованно обслуживать диспетчер, любой класс может получать необходимые сервисы, когда им это нужно. Эта модель также точно обрабатывает несколько зависимостей и дает много полезных возможностей.

Может быть, я не правильно понимаю проблему, потому что вывел проблему из решения, которое вы требовали. Тем не менее, я думаю, что вы пытаетесь использовать Service Tracker для выполнения задачи, для которой он не предназначен.

К сожалению, DS не встроен в каркас, как мы должны были сделать: - (

0 голосов
/ 20 марта 2011

Вы можете создать подкласс ServiceTracker и добавить методы для обеспечения прямого доступа к интересующим вас типам услуг. Например, вы можете хранить сервисы в безопасном гетерогенном контейнере [1]. Затем вы сможете вызывать метод в своем подклассе ServiceTracker, который принимает интересующий вас тип сервиса, и их можно легко найти в безопасном гетерогенном контейнере.

[1] Effective Java, 2nd Ed., Item 29.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...