对OSGi中组件调用的一点点理解

       在上一篇博客中,我实践了在OSGi中对组件的简单调用,于是开始对我之前的一个小工程进行基于OSGi的“模块+组件“化重构。不出所料地碰到了问题,实践出真知,解决问题是加深理解的最好方法。

       直接重现问题吧:我构造了一个模块:“services”,专门用于暴露提供服务的接口的;第二个模块:“IO”,包含一些组件,实现了”services“模块里的某些接口;第三个模块:“http”,同样包含了一些组件,并实现了“services”模块里另外一些接口,其中组件A在实现服务的同时,调用了模块“IO”中组件B提供的一个服务。当我构造好这三个模块,启动OSGi框架,输入services命令,发现所有实现的服务发布成功。但是问题来了,信息显示组件B提供的服务没有被任何模块调用!这不可能啊,按理我的“http”模块调用了啊。

       于是开始调试。

         我把模块“IO”移走,在组件A的组件配置文件里reference标签的 cardinality属性改为“1..n”,也就是至少要有一个提供了指定服务的组件在正常工作该组件才能工作,启动OSGi框架,查看发布的服务,组件A提供的服务没有被发布,看来原本组件A是找到了组件B的,而且也是依赖正常的,那为什么显示组件B没有被调用呢?

         把模块“IO”再弄回来,修改下组件A在绑定组件B时的代码,添加句打印语句以作测试。执行,打印语句没有执行~

       我在模块“http”中新建一个不提供服务的组件C,单独调用组件B,运行结果一切如我所愿,信息显示组件B正被组件C调用,那就再次说明组件B没有问题啊。难道OSGi中发布服务的组件不能同时使用其它组件提供的服务?显然不应该啊,多不方便啊。

          出去吃了点东西,回来突然有了个想法,再改。组件A改回原来那样,仍然发布服务的同时调用组件B的服务,但这次新建的组件C不用来调用组件B的服务了,而是调用组件A的服务。运行程序,嘿,正常了!信息提示组件A提供的服务在被C调用,组件B提供的服务在被A调用。

          原来 提供服务的 组件在服务没有被调用的时候,虽然依赖于其它组件提供的服务,但是并不是就意味着已经引用了其它组件提供的服务。只有当它被引用时,它才会引用它所依赖的服务。虽然还是有些别扭,在以后的问题中慢慢感悟吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值