您的位置:首页 > 编程语言

基于 OSGi 的面向服务的组件编程,helloworld

2013-10-12 12:02 309 查看

基于 OSGi 的面向服务的组件编程

OSGi(Open Services Gateway Initiative,开放服务网关协议)提供了一个面向服务组件的编程模型,基于 OSGi 编程,具有模块化,标准化,面向服务,动态性,易复用,易扩展,易部署等诸多优点,本文介绍了基于 OSGi 开发一个应用程序的过程,读者可以学习如何基于 OSGi 开发自己的应用,并从中体会 OSGi 上述的优点。

一. OSGi 简史

OSGi 是由 1999 年成立的 OSGi 联盟提出的一个开放的服务规范,最初的目的是为嵌入式设备,确切地说是为可以通过网络访问的设备提供一个通用的软件运行平台,屏蔽不同设备之间的硬件和操作系统差异,使软件可以动态地部署和更新。后来 Eclipse 组织注意到了 OSGi 的优点,决定将 Eclipse3.0 及后续版本的插件体系结构基于 OSGi 来实现,并专门成立了一个子项目 Equinox 来实现 OSGi R4 规范,把 Equinox 作为 Eclipse 的底层运行平台。Eclipse 组织的这一决定带来了双赢的局面,今天的 Eclipse 由于其出色的可扩展的体系结构,已经不再是一个单纯的 Java IDE,而是一个开放的开发平台,一个通用的可扩展的软件框架,OSGi 也不再局限于嵌入式领域,而是成为了一个通用的动态组件开发环境,在桌面,服务器端等领域得到了大量应用。

对模块化的支持是 Java 的一个重要的发展方向,目前 Java 的模块化标准还存在着JSR 277:Java Module Systems 和 JSR 291:Dynamic Component Support for Java 之争论,其中JSR291 的主要目的就要将 OSGi 引入到 Java 标准中去,JSR277 则是 SUN 发起的一个Java 模块化标准。但 OSGi 事实上已经得到了许多国际IT大企业的支持,并且已经有许多商业软件产品基于 OSGi 来开发,如 IBM 包括 Websphere Application Server(WAS), Rational Software Architecture(RSA) 在内的许多重量级软件产品均已基于 OSGi 来实现,著名的 IoC 框架 Spring 正在整合 OSGi 技术,现在基于 Eclipse 开发 RCP,插件程序也非常流行,可以预见基于OSGi 的 Java 应用程序将会越来越多,也将会有越来越多的软件开发组织改变其软件设计思想和开发方式,拥抱 OSGi 并开始享受 OSGi 带来的好处。

二. 使用 Eclipse 开发 OSGi 应用

本文假设读者已经了解 OSGi 编程的基本概念以及如何在 Eclipse 环境中来开发OSGi Bundle。如果您还不了解这些知识,可以先阅读相关资料如: http://www.eclipse.org/equinox网站以及 developerworks 网站上的文章: 利用 Eclipse 开发基于 OSGi 的 Bundle 应用

Eclipse 开发平台中对基于 OSGi 开发应用程序已经提供了较为完善的支持,在 Eclipse 集成开发环境中可以轻松地完成对一个或多个 bundle 的开发、调试、部署、测试等工作。本文将基于 Equinox OSGi 框架,使用 Eclipse 开发平台来开发一个示例性的系统管理程序,主要目的是给读者演示基于 OSGi 开发一个应用程序的过程并让读者体会基于OSGi 编程带来的模块化,动态性,扩展性等优点。为了便于读者理解,本文会尽可能的保持代码简单易懂,本文中的代码在 WindowsXP,Eclipse3.2,Sun JDK1.5 环境下测试通过。

回页首

三. 需求分析与模块划分

OSGi 带来了规范化的模块划分,低耦合的模块间关系,统一的模块开发方式,可动态插拔的模块管理环境。开发 OSGi 应用程序的第一步是在需求分析的基础上进行精心的模块划分,模块划分的原则是尽量保持单个模块的独立性,使模块与模块之间的耦合降到最小,每一个模块暴露给其它模块的信息最少,尽量让模块之间使用 OSGi 框架提供的服务注册机制来通信。一般可采用一个模块一个 Bundle 的方式,并为每一个 Bundle 在 Eclipse 环境中建立一个 Project 来进行开发,由于模块与模块之间的耦合很小,各个 Bundle 之间并不会象传统的开发方式中的各模块之间那样存在纠缠不清的包和类的引用关系,因此大部分Bundle的开发工作可以并行进行而不会互相影响。

本文实现的系统管理程序,可以提供一系列的系统管理服务来管理计算机内的各类设备。为简便起见,我们首先只实现一项管理服务:Monitor,此项服务可以监视计算机内各类设备的运行状态,我们可以将整个软件划分为如下的一些Bundle:

Services Bundle:在OSGi中,服务是通过Java的接口来定义的,我们可以把定义服务的Java接口集中一个Services Bundle中,并由这个Bundle向

其它Bundle提供接口。

服务提供者Bundle:实现Services Bundle提供的接口并向OSGi框架注册服务。在本例中,我们要实现对各类设备的监视,对于每一个需要监视的

设备,均可以实现一个单独的服务提供者Bundle来提供相应的监视功能。

服务使用者Bundle:引用Services Bundle提供的接口向OSGi框架请求相应的服务,本例中主要实现一个服务使用者Bundle,它是一个控制台程

序,用于执行相应的系统管理服务,并在控制台中向用户显示相应的系统管理信息。

整个程序是由OSGi框架以及运行于OSGi框架内的一批Bundles组成,Bundle之间的协作关系见下图:

图1 程序的总体架构图

package com.systemmanagement.cpumonitor.impl;
import com.systemmanagement.services.monitor.MonitorService;

public class CpuMonitor implements MonitorService {
public String getMonitorMessage() {
return "CPU--温度:40度,电压:1.4v,CPU占用率:20%";
}
}


View Code

再将这个Bundle export成一个jar文件,放到e:\system_management\plugins目录下,并在OSGi控制台中使用update命令更新这个Bundle,我们发现输出的CPU监视信息马上改变了,如下图所示:

图8 更新Bundle



读者还可以在OSGi控制台中尝试使用start,stop等命令启动和停止一些Bundle,观察输出信息的改变,由此来体验一下OSGi的动态性。

由于基于OSGi的应用程序具有高度的模块化和动态性的特点,使得要对其进行扩展也变得非常的方便:一般来说,扩展就是增加新的Bundle,对其它Bundle基本无影响,如上面的例子所示,我们很方便地为应用程序增加了新的功能,更新了它已有的功能,而整个应用程序甚至都不需要重启。Equinox同时还借用了Eclipse中的扩展点的机制,利用扩展点,可以方便的为已有的Bundle扩展功能,但扩展点这一套机制目前还不是OSGi规范中定义的特性,仅是Equinox这一实现平台扩展出来的功能,使用了扩展点的Bundle将有可能不能在其它的OSGi实现框架中正常运行,这需要开发者权衡选择。

七.发布应用程序

在上一节中我们在OSGi控制台中运行我们的系统管理程序,其中还需要手工install, start各个Bundle,显然这很麻烦,不太象一个真正的应用程序,本节将介绍如何构造出一个完整的基于OSGi的应用程序。

首先,Equinox提供了在启动框架时自动安装Bundle以及启动Bundle的功能,这是通过定义config.ini文件来实现的,应用程序的目录结构如下:

E:\SYSMGT_APP1
│  run.bat
│  org.eclipse.osgi_3.2.0.v20060601.jar
├─configuration
│      config.ini
└─plugins
com.systemmanagement.console_1.0.0.jar
com.systemmanagement.cpumonitor_1.0.0.jar
com.systemmanagement.services_1.0.0.jar


config.ini文件的内容如下:

osgi.bundles=plugins/com.systemmanagement.cpumonitor_1.0.0.jar@1:start,
plugins/com.systemmanagement.console_1.0.0.jar@2:start,
plugins/com.systemmanagement.services_1.0.0.jar


注意:"start,"与"plugins/com"之间不能有空格,这里是方便显示

其中的@1,@2用于指定Bundle的Start Level, start表示当OSGi框架启动后即自动启动此Bundle。而run.bat是一个批处理程序,其内容如下:

java –jar org.eclipse.osgi_3.2.0.v20060601.jar -console

现在只需运行run.bat即可运行我们的系统管理应用程序了。

Eclipse中还提供了两个Bundle, org.eclipse.equinox.common和org.eclipse.update.configurator,可用于自动发现和安装指定目录下新增加的Bundle。 我们同样可以在Eclipse的plugins目录中找到这两个Bundle并将它们拷到E:\SYSMGT_APP1\plugins目录下,并修改config.ini文件的内容如下所示:

osgi.bundles=plugins/org.eclipse.equinox.common_3.2.0.v20060603.jar@1:start,
plugins/org.eclipse.update.configurator_3.2.0.v20060605.jar@2:start,
plugins/com.systemmanagement.cpumonitor_1.0.0.jar@2:start,
plugins/com.systemmanagement.console_1.0.0.jar@3:start


这样,当org.eclipse.update.configurator Bundle启动时,它会去自动发现和安装plugins目录新增的Bundle,但需注意, 它并不能自动启动这些Bundle,OSGi协议目前也没有提供这样的标准服务来自动安装,管理和启动Bundle, 我们可以使用如下的一些解决方案来更好地管理和分发Bundle:

利用Eclipse的Update Manager:Eclipse Update Manager提供了一批API用于管理,下载,升级,安装Feature,一个Feature是一批Bundle的集合, 是下载和安装的最小单位。但Feature是Eclipse定义的,不是OSGi协议中定义的特性。

使用FileInstall Bundle,这个Bundle可以监视某一个目录,如果这个目录中新增加了Bundle,它会自动将其install,如果有Bundle被更新了, 它会自动将其update,如果有Bundle从此目录被移走,它会自动将其uninstall。可到 http://www.aqute.biz/Code/FileInstall下载这个Bundle,它可以运行于任何OSGi框架中。

在Equinox孵化器(incubator)中有一个org.eclipse.equinox.simpleconfigurator,可用于管理和控制已安装的Bundle, 包括设置启动级别并自动启动它们。可访问http://www.eclipse.org/equinox/incubator并到其CVS库中下载

八. 小结

本文介绍了基于OSGi开发一个应用程序的完整流程,包括模块划分,Bundle的设计与开发,部署与测试,发布应用程序等,并演示了基于OSGi编程所具有的模块化,面向服务,动态性,易扩展等优点。基于组件或构件编程是学术界提了多年的思想,笔者认为OSGi是一个比较彻底地体现这种思想的编程模型,基于OSGi编程将带来软件设计以及开发方式的改变并由此带来软件生产效率的极大提升。

申明:本文仅代表笔者个人的观点,不代表IBM公司的观点。

下载

描述名字大小
本文所有的示例源代码osgi_samplecodes.zip27KB
转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-osgi/#ibm-pcon
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐