在之前的一篇blog中我曾经写到过CM对于application level的configuration的不适应,提到的主要是两点:
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">
<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>
然后就可以在其他的管理属性的服务中调用ConfigurationAdmin来实现对这个service的属性的管理:
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,看看是不是有人会有办法,:)
分享到:
- 2006-11-22 11:59
- 浏览 2445
- 评论(2)
- 论坛回复 / 浏览 (2 / 3586)
- 查看更多
相关推荐
【窦娥之冤冤几许】历史上的四大冤案.docx
《窦娥冤》是元代戏曲家关汉卿创作的一部具有深远影响的悲剧,讲述了主人公窦娥在元代社会不公的背景下遭受冤屈,最终含冤而死的故事。这部作品不仅展现了元杂剧的独特艺术特点,还揭示了封建社会的黑暗面,对后世...
升卧式平面钢闸门设计知识点: 1. 升卧式平面钢闸门概念:升卧式平面钢闸门是平面钢闸门的一种形式,亦称作升卧门。其工作原理是在关闭状态下垂直挡水,在开启状态下,通过自重和钢丝绳拉力产生的力矩使得闸门沿轨道...
窦娥相信官府,她就不会被判死刑”和“如果不是贪官桃杌胡乱判案,窦娥就不会造成千古奇冤”这两处推断存在问题。按照题目要求,我们需要以①的方式,即否定句式,来指出这些问题。 ② 不是相信官府就不会被判死刑...
该剧通过主角窦娥的形象,揭示了封建社会底层人民所遭受的不公和苦难,展现了人性的善良与坚韧,以及对天理正义的质疑与抗争。 窦娥是一位典型的悲剧人物,她的形象集中体现了孝顺与反抗的双重特质。她的命运坎坷,...
2. 窦娥是元杂剧《窦娥冤》的主人公,她的形象复杂而鲜明,既有温顺善良的一面,又有坚决反抗的性格特征。她愿意为婆婆付出一切,甚至生命,表现出中国传统劳动人民的孝顺和牺牲精神。 3. 元杂剧的表演形式包括曲词...
通过学习窦延平版的讲义,学生不仅可以掌握数据结构的基本概念,还能学会如何在C++环境中实现这些结构,同时加深对算法的理解。这对于提升编程能力,特别是解决复杂问题的能力,具有不可估量的帮助。无论是考研准备...
最终,窦娥在临死之前发下三桩毒誓,宣称如果她是无辜的,那么她死后她的鲜血将不会沾染土地,她死亡的时节将会飘起鹅毛大雪,而且她死后将会出现三年大旱,以此证明她的清白。戏剧的高潮在于窦娥的毒誓一一应验,...
静脉窦血栓是一种罕见但严重的脑血管疾病,涉及到静脉窦的狭窄或闭塞,从而导致脑内血流回流障碍和脑脊液吸收问题。由于其临床表现多样且不具特异性,静脉窦血栓常常被误诊或漏诊,可能导致治疗延误。近年来,随着...
【窦娥冤】是元代戏曲家关汉卿创作的一部悲剧作品,讲述了主人公窦娥在遭受冤屈后,以悲愤的心情控诉天地不公的故事。这部剧是中国古代戏曲中的经典,展现了封建社会中底层人民的苦难和不公正。 在语文练案中,我们...
我们还分析了 POS 机系统种共利益者之间的功能冲突,出卷系统的功能需求,图书馆系统的非功能需求和短信客服中心的需求。 结构化分析是软件开发中的一种重要方法,它可以帮助开发者更好地理解系统的逻辑结构和数据...
恭喜发财 利是窦来 现在有 N 个人,他们都有小孩,春节来了,他们要发压岁钱给朋友的小孩,而他们自己的小孩也会收到压岁钱。为了简单,他们在发压岁钱的时候,使用以下的计算方法,譬如某甲有 100 块,它要给另外三...
2. 关汉卿通过窦娥的故事,揭示了元代乃至古代社会中普遍存在的冤狱问题,指出窦娥的遭遇并非个例,而是封建统治下的一种常态,从而触及到剥削社会的本质。 3. 窦娥的反抗精神表现在她要求以非凡的方式证明自己的...
1. 《窦娥冤》是中国古代戏剧,特别是元曲中的经典之作,由关汉卿创作,讲述了窦娥被冤枉致死的故事,展现了封建社会的司法不公和人民的苦难。 2. 窦娥是剧中的女主角,她的形象体现了无辜受害者的抗争精神和对公正...
1. 《窦娥冤》:《窦娥冤》是元代剧作家关汉卿创作的一部戏剧作品,讲述了窦娥被冤枉致死的故事,是中国古代戏曲的经典之作,具有很高的文学价值。 2. 语言积累:在学习《窦娥冤》时,学生需要掌握正确的汉字发音和...
例如,在《窦娥冤》第三折中,通过窦娥被押赴刑场、与婆婆诀别、临刑等场景,可以看出主要的冲突是窦娥与腐败官员的对抗,展现了窦娥的无辜与社会的不公。 其次,品味戏剧语言也是鉴赏的关键。戏剧语言包括舞台说明...