OSGI开发(三)

来源:互联网 发布:linux recovery mode 编辑:程序博客网 时间:2024/06/09 23:22

这一节主要讲两个例子,一个例子是写一个客户端(client),来弄清楚客户端是怎么调用上一节注册的字典服务的,另外一个例子是再写一个example2 DictionaryService的另一个实现,证明同一个服务多个实现是存在的。

Example3

接下来,再写一个客户端(client)来调用上一节注册的字典服务。主要有以下几个步骤:
1、引用example2写的字典服务,import tim.example2.service.DictionaryService
2、获取服务引用context.getServiceReferences
3、获取服务实例context.getService
4、读取控制台输入的字符串,调用服务接口的方法checkWord判断读取的字符串是否在字典里面
关键代码如下:
这里写图片描述

从上面的代码,可以看出context.getServiceReferences有两个参数,一个是被注册的服务类tim.example2.service.DictionaryService,一个是进一步筛选要调用哪一个服务类的条件。

打开控制台,install example3.jar;start;输入字符串“to”,返回Correct。
这里写图片描述

Example2b

这一节,我们完成example2 DictionaryService的另一个实现,证明同一个服务多个实现是存在的。
在example2中,过滤属性是English,在example2b中,我们设置为French,
props.put(“Language”,”French”);
context.registerService(DictionaryService.class.getName(),new DictionaryImpl(),props);
同时再把我们的字典库修改为String[] m_dictionary = {“thank”,”you”,”for”,”you”};
其他基本保持和example一致。
再修改example3,增加对相同服务名的另一个实例调用checkWord方法。
这里写图片描述

//获取服务引用
ServiceReference[] refs =
context.getServiceReferences(DictionaryService.class.getName(),”(Language=*)”);
如果example2和example2b两个服务都注册,由于example3的过滤条件是Language=*,所以无论example2和example2b都满足条件,这里refs[]将获得两个服务的引用。
我们注册号两个服务,也就是example2和example2b,然后启动start 客户端(example3),再输入“you”,实验结果如下:
这里写图片描述
实验设置English Dictionary 的字典库为:{“welcome”,”to”,”the”,”osgi”}
实验设置french Dictionary的字典库为:{“thank”,”you”,”for”,”you”}
由实验结果,输入的字符串匹配字典库,我们可以知道先调用的是french Dictionary字典服务。此时也表明了不止一个服务。
然后我们再输入“to”,实验结果如下:
这里写图片描述
由实验结果,输入的字符串匹配字典库,所以调用的是English Dictionary字典服务。

以上已经介绍了如何注册服务,如何调用,这里再介绍一下两种监听服务
1、监听服务,使用addServiceListener
缺点是只会监听到最新注册的Service,对已有的Service无法处理。
2、使用ServiceTracker
ServiceTracker其实是对ServiceListener实现方式的封装,使得对service的获取更加简洁,同时也解决了不能监听到已经存在的Service的问题
ServiceTracker获取服务实例,主要有以下几个步骤:

m_tracker = new ServiceTracker(......);m_tracker.open();DictionaryService dictionary = (DictionaryService) m_tracker.getService();m_tracker.close();

还有另外一种需求是我们以上例子没有办法满足的:服务的延迟创建。显然,以上的服务对象在Bundle启动时就已经创建了,无论是否有地方请求使用这些服务,服务对象都在那里。如果希望构造服务对象的过程延迟到真正使用服务的时候,那么示例的代码也无法满足。针对这种情况,OSGI提供的解决方案是引入服务工厂。
服务工厂有两个明显的优点:
1、有时service需要知道是哪个bundle在使用它。例如logger服务,它需要在日志中记录是哪个bundle调用它的。
2、延迟初始化Service

基本给个大概印象,以后项目用到再深究。还有服务钩子、声明式服务

原创粉丝点击