何时使用 ServiceTracker 与 ServiceReference

2022-09-04 21:00:49

我刚刚开始进行OSGi编程,并且遇到了两种侦听被激活服务的方法来。

第一种方法,来自EclipserRCP的书,使用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.ServiceTrackerServiceTracker

简化了使用框架服务注册表中的服务。

在编程中,总是有几种方法可以做事。您可以自己管理您的服务引用,或者如果它适合您或您的问题,请使用具有其用例的捆绑实用程序类。

另请查看此访问服务的最佳做法

其他一些来源指出,大多数时候使用它是明智的ServiceTracker

Eclipse 扩展和 OSGi 服务的比较

OSGi 服务跟踪器

OSGi 入门:使用服务


答案 2

推荐