在之前的一篇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,看看是不是有人会有办法,:)
分享到:
相关推荐
【窦娥之冤冤几许】历史上的四大冤案.docx
升卧式平面钢闸门设计知识点: 1. 升卧式平面钢闸门概念:升卧式平面钢闸门是平面钢闸门的一种形式,亦称作升卧门。其工作原理是在关闭状态下垂直挡水,在开启状态下,通过自重和钢丝绳拉力产生的力矩使得闸门沿轨道...
本文将通过窦娥这一人物形象的分析,探讨其在作品中的典型意义及对后世的影响。 窦娥的形象具有双重特质:一方面她孝顺、贞洁,坚守传统美德;另一方面,她不屈不挠,敢于对抗不公,体现了封建社会底层人民的悲剧...
窦娥相信官府,她就不会被判死刑”和“如果不是贪官桃杌胡乱判案,窦娥就不会造成千古奇冤”这两处推断存在问题。按照题目要求,我们需要以①的方式,即否定句式,来指出这些问题。 ② 不是相信官府就不会被判死刑...
本文旨在通过对《窦娥冤》的教学内容的深入挖掘,阐述如何在语文教学中利用这一教案,让学生更深刻地理解元杂剧的艺术特点,洞察作品背后的社会背景,赏析窦娥这一形象,学习关汉卿的写作手法,以及认识作品的文学...
通过学习窦延平版的讲义,学生不仅可以掌握数据结构的基本概念,还能学会如何在C++环境中实现这些结构,同时加深对算法的理解。这对于提升编程能力,特别是解决复杂问题的能力,具有不可估量的帮助。无论是考研准备...
最终,窦娥在临死之前发下三桩毒誓,宣称如果她是无辜的,那么她死后她的鲜血将不会沾染土地,她死亡的时节将会飘起鹅毛大雪,而且她死后将会出现三年大旱,以此证明她的清白。戏剧的高潮在于窦娥的毒誓一一应验,...
静脉窦血栓是一种罕见但严重的脑血管疾病,涉及到静脉窦的狭窄或闭塞,从而导致脑内血流回流障碍和脑脊液吸收问题。由于其临床表现多样且不具特异性,静脉窦血栓常常被误诊或漏诊,可能导致治疗延误。近年来,随着...
窦娥的形象塑造中,除了展示她对家庭的忠诚和坚韧不拔之外,还体现了她的细心和深沉的爱。在面对死亡的威胁时,她依然能够考虑到婆婆的感受,这种超越自我、为他人着想的精神,凸显了她人格的伟大和道德的高尚。 ...
我们还分析了 POS 机系统种共利益者之间的功能冲突,出卷系统的功能需求,图书馆系统的非功能需求和短信客服中心的需求。 结构化分析是软件开发中的一种重要方法,它可以帮助开发者更好地理解系统的逻辑结构和数据...
恭喜发财 利是窦来 现在有 N 个人,他们都有小孩,春节来了,他们要发压岁钱给朋友的小孩,而他们自己的小孩也会收到压岁钱。为了简单,他们在发压岁钱的时候,使用以下的计算方法,譬如某甲有 100 块,它要给另外三...
1. 《窦娥冤》:《窦娥冤》是元代剧作家关汉卿创作的一部戏剧作品,讲述了窦娥被冤枉致死的故事,是中国古代戏曲的经典之作,具有很高的文学价值。 2. 语言积累:在学习《窦娥冤》时,学生需要掌握正确的汉字发音和...
**EDA技术概论** EDA(Electronic Design Automation),即电子设计自动化,是利用计算机辅助设计(CAD)、计算机辅助工程(CAE)等技术,通过强大的电子计算机和特定的EDA工具软件平台,对硬件描述语言(HDL)编写...
此剧取材于一个真实的故事,借助主人公窦娥的悲惨遭遇,展现了一个封建社会底层人物面对不公与冤屈时的无奈和反抗。在2018_2019学年高中语文练案中,我们看到了与《窦娥冤》相关的教学内容,其重点在于引导学生深入...
3. 调皮的表白:“情人节我只想对你说:我不爱你,是不可能的:我不疼你,是没道理的:我不想你,比窦娥还冤的。”这种俏皮的语言能增加亲密度和幽默感。 4. 实际的关怀:“情人节快到了,你一定要全面实践科学情人...
IEC61850 建模与实现 IEC61850 是一种基于以太网的智能电网通信标准,旨在实现智能电网中的自动化、数字化和智能化。 IEC61850 标准的核心是模型驱动的通信协议,它将电力系统的自动化、监控和保护功能集成到一个...