1.osgi
DSF构建在osgi服务api之上,osgi提供丰富的api来管理服务,为了使用DSF,理解osgi服务api的一些基础知识是很重要的
1.1注册-服务需要使用osgi框架来注册和注销他们自己
- BundleContext.registerService() – 注册一个服务, 他返回 ServiceRegistration对象,调用方应该保留该对象.
- ServiceRegistration.unregister() – 注销服务.
1.2引用 – 客户需要使用一个服务,就需要获取一个服务的引用. OSGi 提供引用计数的功能.
BundleContext.getServiceReference(), BundleContext.getServiceReferences(), BundleContext.getAllServiceReferences() – 这几个方法用于通过一个类名或者属性过滤器来检索一个服务的引用.
BundleContext.ungetService() – 释放一个服务引用并减少其使用计数
1.3事件 – 客服端使用服务来监听服务事件. 当服务被删除,添加或者修改时,事件发出
org.osgi.framework.ServiceListener – 服务监听器的接口,实现这个接口的对象可以用BundleContext注册
小贴士:服务api都使用BundleContext,它们要求BundleContext处于active状态。这意味着基于DSF的调试器集成会在插件启动之后初始化,但也会在插件停止之前关闭。第一部分并不难,但第二部分通常要求插件的BundleActivator.stop()方法关闭调试器。
2.session
基于DSF的调试器集成可以注册许多服务,并且有多个调试器实例使用相同的接口注册服务。为了帮助协调调试器实例并且区分调试实例,DSFservices被组织为session。
DSF session功能包括:
- 唯一的sessionID:这个id用于区分不用session中的服务,客户端还可以通过静态方法使用id获取session实例
- session生命周期事件:当session开始和结束时,客户端可以注册侦听。
- DSF Executor:每个session都关联一个单线程的DSF Executor。多个sessions也可以共享一个executor。
- sevice events:session被用于调度服务事件,
- model adapter:session允许注册一个adapter,这个adapter将由给定session中给定adapter类型的所有Data Model Context返回(简单说就是 Data Model Context将返回adapter?)
-
Executor
在同一session中注册的所有service共享一个DSF Executor。按照约定,所有公共服务接口都应限制在此Executor线程中调用。这一点可以追溯到DSF的主要同步机制。遵循此规则大大简化了保护服务状态信息完整性的任务。注意:应该使用此session的DSF Executor调用所有service的public方法。
-
Tracker(跟踪器)
使用osgi api直接访问服务非常麻烦。检索服务引用的客服端负责保留serviceReference对象,并且调用BundleContext.ungetService()来避免引用泄漏,由于服务可能随时注销,客服端需要随时监听何时服务被注销,幸运的是,有两个实用程序帮助完成这项任务
org.osgi.util.tracker.ServiceTracker | org.eclipse.cdt.dsf.service.DsfServicesTracker | |
---|---|---|
Services tracked | 用一个给定的类名或者过滤器跟踪所有服务 | 用一个 给定的DSF session跟踪所有服务 |
Thread safety | 线程安全 | 仅限于 session exector线程 |
Accessors methods | 1.getService() – 返回匹配到的第一个service 2.getServices() – 返回匹配到的所有service. | 1.getService(Class) 2.getService(Class, String) |
Activation/Disposal methods | open() close() | 1.DSF services tracker 在创建后会立刻被使用 2.dispose() |
注意:所有的service trackers 必须disposed (or closed). 没有关闭tracker会引发引用服务泄漏.
5.初始化和关闭
每个DSF服务必须实现IDsfService.initialize() 和 IDsfService.shutdown()方法。这些方法只能在会话执行器线程中调用,并且是异步的。作为初始化的最后一步,服务应该注册自己。同样,作为关闭服务的第一步,服务应该注销自身。同样在初始化期间,每个服务都应该调用DsfSession.getAndIncrementServiceStartupCounter()(AbstractDsfService调用了),以获取服务的启动编号。此数字用于确定服务事件的优先级。
启动大量DSF服务需要按预定义的顺序调用大量异步方法。实现这个启动代码可能很麻烦,DSF提供了一个实用工具来实现它:org.eclipse.cdt.DSF.concurrent.Sequence。
下面是计时器示例展示:执行关闭服务任务时,序列如何被扩展
org.eclipse.cdt.examples.dsf.timers.ServicesShutdownSequence
public class ServicesShutdownSequence extends Sequence {
27: // Session to that the services are running in.
28: final private DsfSession fSession;
29:
30: // DSF Services is created as the first step of the sequence. It
31: // cannot be created by the constructor because it can only be called
32: // in the session thread.
33: DsfServicesTracker fTracker;
35: public ServicesShutdownSequence(DsfSession session) {
36: super(session.getExecutor());
37: fSession = session;
38: }
39:
40: Step[] fSteps = new Step[] {
41: new Step() {
今天的文章dsf服务化接口_ds6显示service[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87034.html