我刚开始使用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
原文地址:https://www.jb51.cc/java/123279.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。