加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 何时使用ServiceTracker与ServiceReference

发布时间:2020-12-14 05:09:56 所属栏目:Java 来源:网络整理
导读:我刚开始使用OSGI编程,并且已经遇到两种方式来监听被激活的服务. 第一种方法,从EclipseRCP书籍,使用ServiceReference: String filter="(objectclass="+IModelCreator.class.getName()+")";context.addServiceListener(this,filter);modelCreators = Collect
我刚开始使用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();

哪一个是正确的和/或最好的方式来持有所有实现给定接口的服务的注册表?还有另一种方法来实现吗?为什么似乎有两种做同样的事情呢?

解决方法

因为您已经可以从包名称org.osgi.util.tracker.ServiceTracker获得表单,ServiceTracker是一个实用工具类(在某些情况下)

simplifies using services from the
Framework’s service registry.

在编程中总是有几种做事的方法.您可以自己管理您的ServiceReferences,或者是否适合您或您的问题使用具有其用例的捆绑实用程序类.

还要检查这个Best practices for accessing services

一些其他的消息来源说,它大部分时间是明智的使用ServiceTracker

A Comparison of Eclipse Extensions and OSGi Services

OSGi Service Tracker

Getting Started with OSGi: Consuming a Service

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读