当前位置: 首页 > 服务器 > IBM > IBM软件 > 深入OSGi:如何构建可扩展动态的Web程序

深入OSGi:如何构建可扩展动态的Web程序

2012-06-08 20:56 来源:风信网 作者:末信 人气指数: 我要评论

构建可扩展的基于 OSGi 的程序

在最新发布的的 Java7 中,对程序模块化特性仍然没有涉及,与此同时,OSGi(Open Service Gateway Initial),一种 Java 模块化系统规范,现在已经被广泛的应用于 Java 中间件上,如 IBM WebSphere,Oracle Weblogic,RedHat Jboss,Sun GlassFish 等。

OSGi 解决了什么?

OSGi 致力于解决以下几点:

模块化构建系统,解决复杂的依赖性

传统的 Java 应用程序会用到类 (class) 和接口 (interface) 类型,这些类型中又会包含方法 (method),成员变量 (variable)。所有用到的类型通过包 (package) 组装在一块,即包 (package) 定义了全局命名空间,如下图所示,所有的这些类型、包经编译后以 JAR 形式发布 (Java Archives)。在运行时,JVM 会根据字节码中的引用在 Classpath 里面的 JAR 列表中搜索并加载到内存中。

图 1. Jar 文件类结构
 


但是缺点在于,

    • 包作为模块划分的边界,粒度太小,系统中可以有成千上万的包
    • JAR 只是一种承载方式,没有任何运行时特性来支持更复杂的场景

Bundle,可以将其理解为自描述的 JAR 文件。在 bundle 的 manifest 文件中,会有对本 bundle 的标识、提供的功能 (Export-package) 及依赖性 (Import-Package/Require-Bundle) 的定义。每个 bundle 在运行时自己的类加载器 (Class Loader),这样可以做到一方面把不同的 bundle 里面的类区别开来,当 bundle 被卸载时,只有这个 bundle 的类加载器中的信息会丢失;另一方面,可以在自己的 bundle 内部充分利用 Java 的成员访问控制机制。

可动态的安装卸载 bundle

OSGi 框架为 Java 系统提供了一个通用的容器,该系统中的 bundle,无需停止系统,即可实现 bundle 的安装、卸载。

面向服务编程

Bundles 之间协作,可以通过直接引用类型实现,但会因直接依赖性导致模块之间的紧耦合。OSGi 提供了服务注册表 (Service Registry),通过服务注册表,bundle 可以使用匿名的服务,即提供服务的 bundle 不知道谁会消费该 Service,而消费服务的 bundle 也不知道谁提供了服务。在基于 OSGi Service 模型编程时,由于该模型的动态性,需要有方法可以跟踪动态的 service,例如,引用的服务随时可能注销。解决这个问题,一种选择是 Listener 模式,该模式最初被用于 Java GUI 编程中的事件模型。下图是 Sun 改进后的事件模型,该模型中的实体包括,

图 2. Java GUI 事件模型
 

  • 事件源 (event source) 该对象产生时间
  • 事件对象 (event object) 封装事件信息
  • 事件监听者 (event listener),处理事件信息

假设,用户想监听鼠标动作时,需首先实现 MouseMotionListener 接口,并将其注册在时间源上,当有事件发生时,事件源首先将事件相关信息封装成 MouseMotionEvent 对象,然后遍历并向自己维护的监听者列表发送通知。该模型允许同时多个监听者,对 GUI 编程非常方便。但一个潜在的缺点是事件源和事件监听者之间的依赖性。当某一个事件监听者不再监听时,事件源需从自己维护的列表中去掉这个引用,反之亦然,如果使用不当,还会产生内存泄漏。OSGi 被设计用于嵌入式系统领域,受限于系统资源,也不支持在内存中维护大量的引用。OSGi 规范中的白板模式 (Whiteboard pattern) 可以有效的解决这个问题,它充分利用了 OSGi 每个 bundle 不需要自己维护的 registry,所有的事件监听器都在 OSGi registry 注册为 Service, 对于事件源,它所需要做的就是获得 OSGi 框架的 registry,得到监听器,然后调用监听器,其他的事情都交给 OSGi 框架去做。这样使得 bundle 自身的代码更简单和清晰,符合 OSGi 设计的主旨。

大家感兴趣的内容
小伙伴最爱的新闻
小伙伴还关注了以下信息
小伙伴关注的焦点

小伙伴都在关注的热门词

芈月传 老司机玩法 萌乐网 黑科技 坐骑揭秘 三国令 铁血皇城 竞技场攻略 书剑恩仇录 披风玩法 装备强化攻略 野外BOSS玩法 全网曝光 赤壁传说 半回合制国 ACT 哥们网 天书世界 奇珍商城 热血战歌 传奇宝藏抽奖 门徒 范伟打天下 打开方式 门徒获取玩法 三大萌宠简介 新手攻略 挂机系统简介 材料副本 大海战 鸵鸟 大黑 激情玩法 门徒战力提升 万世 强化属性 上古降魔 提升战力 装备攻略 九阴绝学 品质推荐 老干妈 激战来袭 大黑游戏 新服亮点 福利多多 画江山 资料片 玩家 九阴真经 江湖儿女 真实场景 现实 虚拟 随机副本 风色轨迹 听天由命 ppwan 神助攻 武林秘药 激活八大脉门 九天劫变 猎命格 天问 大型PVP 花千骨 激战更尽兴 网易mumu 手游玩家 安卓模拟器 安卓 单挑群战 武侠传说 女神 孙尚香专访 胸猛抱团 新游 占山为王 跨服城战 蜀山战纪 剑雨江湖 攻略 实时VR交互 七大女神代言 酷炫走江湖 世界四大杀手 玩家专访 三国经典 大制作 好玩网页游戏 盘点 宇宙霸主 境界玩法 莽荒纪 勇闯难关 镜像副本 荒漠霸主 装备精通 三大战役 鹌小彦奇谈