【问题标题】:When to use ServiceTracker vs ServiceReference何时使用 ServiceTracker 与 ServiceReference
【发布时间】:2010-12-17 15:19:50
【问题描述】:

我刚开始使用 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();

以下哪一项是保存实现给定接口的所有服务的寄存器的正确和/或最佳方式?还有另一种方法可以做到这一点吗?为什么似乎有两种方法可以做同样的事情?

【问题讨论】:

    标签: java osgi


    【解决方案1】:

    正如您已经可以从包名 org.osgi.util.tracker.ServiceTracker 派生的那样,ServiceTracker 是一个实用程序类(在某些情况下)

    简化了从 框架的服务注册表。

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

    也可以查看Best practices for accessing services

    其他一些消息来源表明大多数时候使用ServiceTracker 是明智的

    A Comparison of Eclipse Extensions and OSGi Services

    OSGi Service Tracker

    Getting Started with OSGi: Consuming a Service

    【讨论】:

      猜你喜欢
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多