Когда использовать ServiceTracker и ServiceReference
Я только начинаю с программирования OSGi и сталкиваюсь с двумя способами прослушивания для активируемых служб.
Первый способ, из книги EclipseRCP, использует ServiceReference:
String filter="(objectclass="+IModelCreator.class.getName()+")";
context.addServiceListener(this, filter);
modelCreators = Collections.synchronizedMap(
new HashMap<ModelID, List<IModelCreator>>());
ServiceReference references[] = context.getServiceReferences(null, filter);
if(references==null) return;
for(int i=0;i<references.length;++i) {
this.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED,
references[i]));
}
Второй, из интернет-примеров, использует ServiceTracker:
ServiceTracker logReaderTracker = new ServiceTracker(context,
org.osgi.service.log.LogReaderService.class.getName(), null);
logReaderTracker.open();
Object[] readers = logReaderTracker.getServices();
if (readers != null) {
for (int i = 0; i < readers.length; i++) {
LogReaderService lrs = (LogReaderService) readers[i];
m_readers.add(lrs);
lrs.addLogListener(m_logger);
}
}
logReaderTracker.close();
Какой из них является правильным и/или лучшим способом хранения реестра всех служб, реализующих данный интерфейс? Есть ли другой способ сделать это? Почему, кажется, есть два способа сделать одно и то же?
Ответы
Ответ 1
Как вы уже можете получить форму, имя пакета org.osgi.util.tracker.ServiceTracker
есть ServiceTracker
класс утилиты, который (в некоторых случаях)
упрощает использование сервисов из Рамочный сервисный реестр.
В программировании всегда есть несколько способов сделать что-то. Вы либо можете самостоятельно управлять своими ServiceReferences, либо, если это подходит вам или вашей проблеме, используйте связанный с ним служебный класс, который имеет свои варианты использования.
Также проверьте этот Рекомендации по доступу к сервисам
Некоторые другие источники, которые утверждают, что в большинстве случаев разумно использовать ServiceTracker
Сравнение расширений Eclipse и служб OSGi
OSGi Service Tracker
Начало работы с OSGi: использование службы