浏览 3587 次
锁定老帖子 主题:比窦娥还冤的CM
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-22
1、无法在外部统一的对Bundle中service所需要的属性进行管理; 当时基于这个约束,只好在各自的bundle下编写一个管理当前bundle属性的服务,当外部需要管理此bundle的属性时,必须通过这个服务来管理,否则的话改变是不会起到效果的。 2、无法共享属性的配置。 每个bundle都保存自己独立的一份属性配置,这就导致了当出现共享属性时,在管理端也不得不同时去重复的更新多个bundle。 昨天在调试产品的时候,又被CM搞的郁闷了一把,由于CM是根据BundleLocation和service.PID共同来绑定属性的,也就是说当BundleLocation改变了的情况下属性就无效了,而且也无法被重写,这对于实际的应用而言几乎是不可接受的,因为模块部署的路径、模块的名称改变这都是很正常的事,但根据CM这样的方式的话,也就意味着模块部署的路径、模块的名称都是不可改变的。 想想挺恼人的,就开始仔细的看Equinox的CM实现的代码,经过仔细的查看后,发现自己疏忽了一点,冤枉了CM,其实CM也是留了一个口以供上面这样的情况下的处理的,后来对照了下OSGi R4中CM规范的描述,确实如此,如果希望配置不要和bundleLocation绑定,那么可以在注册ManagedService接口实现的服务时将其server.bundleLocation设置为null,如下: <component name="PortComponent">
然后就可以在其他的管理属性的服务中调用ConfigurationAdmin来实现对这个service的属性的管理:<implementation class="com.terdon.spike.port.PortService"/> <property name="service.pid" value="com.terdon.port"/> <property name="service.bundleLocation" value="null"/> <service> <provide interface="org.osgi.service.cm.ManagedService"/> service> component> Configuration configuration=admin.getConfiguration("com.terdon.port", null); 根据这样的分析,也就是说我以前所说的第一点的情况是冤枉了CM,现在开始给它平反,:) 摘一下OSGi R4 CM规范中对于这种情况的描述: "Bundles with the required permission can create Configuration objects that are not bound. In other words, they have their location set to null. This can be useful for pre-configuring bundles before they are installed without having to know their actual locations. In this scenario, the Configuration object must become bound to the first bundle that registers a Managed Service (or Managed Service Factory) with the right PID. A bundle could still possibly obtain another bundle’s configuration by registering a Managed Service with the right PID before the victim bundle does so. This situation can be regarded as a denial-of-service attack, because the victim bundle would never receive its configuration information. Such an attack can be avoided by always binding Configuration objects to the right locations. It can also be detected by the Configuration Admin service when the victim bundle registers the correct PID and two equal PIDs are then registered. This violation of this specification should be logged." 从上面这段描述中,可以看出,CM之所以这么设计主要还是从安全性的角度考虑的。 但对于第二点,目前看来确实是如此,属性无法共享,因为pid必须是唯一的,我已经发了邮件给equinox maillist,看看是不是有人会有办法,:) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-11-30
你好,BlueDavy,我有个问题想请假一下你(或者大家,呵呵),不知道提在这里是否方便。就是如果两个bundle都必须互相要import对方的package,请问这样是不是不行,一般通过什么办法解决这种问题呢?通过DynamicImport-Package也不行吗?
|
|
返回顶楼 | |
发表时间:2006-12-04
两个Bundle需要互相引用对方的package,这是不支持的。
对于这样的场景一般的做法都是重构设计或者提取构成一个接口性质的Bundle,分别由两个Bundle去实现所需的接口即可。 |
|
返回顶楼 | |