ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:1.24MB ,
资源ID:8925913      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8925913.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(OSGI原理和实现框架总结.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

OSGI原理和实现框架总结.docx

1、OSGI原理和实现框架总结OSGI原理和实现框架总结V1.0.0版本编制修改/日期审核/日期批准/日期备注1.0.0伏红平/2011-09-15初稿目录OSGI原理和实现框架总结 1目录 2OSGI解读 3安全层: 3模块层: 4生命周期层: 6服务层: 7服务规范: 8Equinox 8项目主页: 8目前发布版本: 8遵循标准: 9Licenses 9下载: 9开发和调试: 9运行: 9Felix 9项目主页: 9目前发布版本: 9遵循标准: 10Licenses 10下载: 10开发和调试: 10运行: 10文档: 10其它: 10Knopflerfish 11官方网站: 11目前发布版本

2、: 11遵循标准: 11License 11Knopflerfish 3.X中包含的组件: 12安装Knopflerfish 12运行Knopflerfish 12创建bundles 13例子:两个数计算服务 13设置开发调试环境: 13接口定义: 15接口实现: 18获取服务: 21测试: 24调试: 24导出bundles: 25部署到equinox: 26部署到Felix: 27部署到Knopflerfish: 28个人总结: 29参考资料: 29OSGI解读OSGI框架从功能上分为下面几个层次:安全层 Security Layer模块层 Module Layer生命周期层 Life C

3、ycle Layer服务接口层 Service Layer安全层:OSGi安全层是OSGi服务框架的一个可选的层。它基于Java 2 安全体系结构,提供了对精密控制环境下的应用部署和管理的基础架构。OSGi服务平台采用两种方式对代码进行校验:位置验证签名验证模块层:Module Layer定义了在OSGI框架中是怎么去按照Module的思想去开发的。框架定义了模型化单元,称之为一个 bundle。一个bundle由java的类和其他资源组成,可以为终端用户提供功能。通过良好定义的方式,Bundle 可以和导入(importer)及导出(exporter) Bundle之间共享Java包。在OS

4、Gi服务框架中,bundle是仅有的需要部署的Java应用实体。Bundle以JAR文件的方式进行部署。一个bundle是一个如下的JAR文件:拥有提供服务所必须的资源。这些资源可以是 java的class文件,或者是其他的数据如HTML文件,帮助文件,图标文件等。一个bundle JAR文件也可以嵌入其他JAR文件作为资源,但是不支持多层嵌套的JAR。有一个manifest文件描述JAR文件内容和bundle的信息。该文件处于JAR的头部,提供框架需要的安装和激活bundle所需的信息。例如,它对其他资源如 JAR文件的依赖这种状态信息必须在bundle运行之前加载。可以在OSGI-OPT文

5、件夹提供可选的文档信息,该文件夹可以位于 JAR文件根目录或者它的子文件夹中。OSGI-OPT文件夹中的内容都是可选的。例如,可以在其中保存bundle的源代码。管理系统可以删除该文件夹内容,以便于节约OSGi服务平台的存储空间。当一个bundle开始运行,通过OSGi服务平台,它开始对安装在平台内的其他bundle提供功能和服务。Bundle 的描述信息在一个 manifest 文件中,在 JAR 文件中的 META-INF 目录下的MANIFEST.MF文件。框架在manifest文件头中定义了Export-Package和Bundle-Classpath这样的OSGi manifest

6、头,bundle的开发人员可以使用它们提供 bundle的描述信息。类加载机制:许多bundle可以共享虚拟机(VM)。在VM内部,bundle可以相互隐藏包和类,也可以和其他bundle共享包。隔离和共享包关键是由java的类加载器来实现,类加载器通过仔细定义的规则从bundle空间的一个子集中加载类。每一个bundle只会有一个单独的类加载器,类加载器形成了一个类加载的代理网络结构,如下所示:类加载器可以加载类和资源,加载途径有:启动类路径:启动类路径中有一个java.*的包以及它实现的包。框架类路径:在框架中通常有一个单独的类加载器,加载框架实现的类和关键的服务接口类。 Bundle类空

7、间:bundle的类空间由和bundle相关的JAR文件组成,以及其他和bundle紧密相关的JAR文件,比如bundle片断类空间是指一个给定的bundle类加载器可以访问到的所有的类。因此,一个指定bundle的类空间来自:父类加载器(通常是来自启动类路径的java.*包中的)导入的包必须的bundle Bundle类路径(私有包)附加的片断类空间必须是一致的,也就是说不能存在相同全名的两个类(为了防止类声明错误)。但是,在OSGi框架中,不同的类空间可以存在同名的类。在模块层,支持不同版本的类加载到相同的虚拟机中。在使用一个 bundle之前,框架必须对共享的包之间的约束关系进行解析。解

8、析过程就是确定导入包如何连接到导出包。 bundle的 package共享机制在开发中可以直接通过import-package方式来引用所需要的package。通过export-package方式来导出对外暴露才包。也可以在import-package中或者export-package中设置其过滤属性,以更加准确的获取或导出所需要的package。可以通过版本过滤、元数据信息过滤、自定义属性过滤、必须的属性过滤来实现过滤获取或导出package。生命周期层:bundle可以处于以下状态中的一种: INSTALLED 成功安装bundle RESOLVED 所有bundle需要的Java类都准备

9、好了。这个状态标志着 bundle已经是启动就绪或者是已经停止。 STARTING 正在启动bundle。调用了bundle激活器的start方法,而且还没有从方法中返回。 ACTIVE bundle已经启动完毕,正在运行中。 STOPPING 正在停止bundle。调用了bundle激活器的stop方法,而且还没有从方法中返回。 UNINSTALLED bundle已经卸载完毕,不能进入其他状态。 安装 Bundle 通过 BundleContext 的 installBundle 方法来安装 Bundle,在安装前首先需要对 Bundle进行校验,如校验通过, OSGI 框架中将安装 Bu

10、ndle到系统中,此时 OSGI 框架会分配一个高于现在系统中所有的 Bundle 的 ID 给新的Bundle,安装完毕后 Bundle 的状态就变为 INSTALLED 了,同时会返回bundle 对象,在 Bundle 安装后就要使用 bundle 对象来管理 Bundle 的生命周期状态了。 解析 Bundle Bundle 安装完毕后,OSGI 框架将对 Bundle 进行解析,以检测 Bundle 中的类依赖等是否正确,如有错误则仍然处于 INSTALLED 状态,如成功Bundle 的状态则转变为 RESOLVED。 启动 Bundle 在启动 Bundle 前需检测 Bundl

11、e 的状态,如 Bundle状态不为 RESOLVED,那么需要先解析 Bundle,如启动一个解析失败的 Bundle,则会抛出BundleException,但此时 Bundle 的状态仍然会被设置为 ACTIVE;如Bundle 的状态已经是 ACTIVE,那么启动 Bundle对它不会产生任何影响。通过 BundleContext 的 getBundle 方法可获取指定 Bundle ID 的 Bundle 对象,在获取到Bundle对象后可使用Bundle对象的start方法来启动Bundle,此时会调用 MANIFEST.MF 中的 Bundle-Activator 属性对应的Bu

12、ndleActivator 类的 start 方法(如存在 BundleActivator 类),在 start 方法执行的过程中 Bundle 的状态为 STARTING,当 start 方法执行完毕后Bundle 的状态转变为 ACTIVE,如 start 方法执行失败,Bundle 的状态转变为 RESOLVED。 停止 Bundle 通过 BundleContext 的 getBundle 方法可获取指定 Bundle ID 的 Bundle 对象,在获取到Bundle对象后可使用Bundle对象的stop方法来启动Bundle,此时会调用 MANIFEST.MF 中的 Bundle-

13、Activator 属性对应的BundleActivator类的 stop方法,在 stop 方法执行的过程中 Bundle 的状态为STOPPING,当stop方法执行完毕后Bundle的状态转变为RESOLVED,如 stop 方法执行失败,Bundle 的状态则继续保留原状态。即使 Bundle 已经停止,其 export 的 package 仍然是可以使用的,这也就意味着可以执行 RESOLVED状态的 Bundle 中 export package的类。 卸载 Bundle 通过调用 Bundle 对象的uninstall 方法可完成 Bundle 的卸载,此时 Bundle的状态转

14、变为 UNINSTALLED。即使 Bundle已卸载,其 export 的package 对于已经在使用的 Bundle 而言仍然是可用的,但对于新增的 Bundle 则不可使用已卸载的 Bundle export的 package。 监听 Bundle的状态在监听 Bundle 的状态上 OSGI 采用的是典型的 Java 中的事件机制,在 OSGI中事件分为 Framework Event和 Bundle Event 两种,Framework Event 用于报告 Framework 已启动、改变了 StartLevel、刷新了 packages或是出现了错误;而 Bundle Even

15、t 则用于报告 Bundle 的生命周期的改变。可通过实现BundleListener或SynchronousBundleListener来监听Bundle Event,可通过实现 FrameworkListener来监听 Framework Event。服务层:Service Layer定义了 Bundle 动态协作的服务发布、查找和绑定模型,Service Layer基于 Module Layer和 Lifecycle Layer,使得 OSGI 形成了完整的动态模型。不过 Service Layer 的定义比较简单,是一个典型的 Service Locator 模式的模型,Service

16、 通过BundleContext 完成注册和获取。 服务的注册可在任何时候通过 BundleContext的 registerService 方法来完成服务的注册,和其他的服务框架一样,在 OSGI 中注册服务时也可以注册一个 ServiceFactory的类,服务成功注册后会返回 ServiceRegistration 对象,通过这个对象的unregister方法可卸载服务。 服务的获取可在任何时刻通过 BundleContext 来获取服务,而通过 BundleContext在需要的时候获取服务则可保证获取服务的动态性。 服务的监听通过实现 ServiceListener 可监听Servi

17、ce 的状态,通过 BundleContext 注册监听器,在注册监听器时可增加过滤的属性,以更加准确的监听希望监听的服务的事件。在 OSGI R4 中还推出了Declarative ServicesDeclarative Services提供了更好的服务注册、获取、监听等方式,使得其成为了OSGI R4 中的重要角色,并由此替代了 Service Layer。DS 提出了完整的 Service-Oriented Component Model (SOCM)概念,使得在 Bundle中可以按照ComponentService的方式进行开发。Component和 Service 从定义上来看是差

18、不多的,任何一个普通的 Java对象都可以通过在配置文件中定义成 Component, Component 有下面这些作用: 对外提供 Service; 使用其他 Component 提供的 Service; 交由 OSGI 框架管理生命周期。通过配置文件可以把一个普通的 Java对象定义为 DS 中的 Component。在DS中,服务的发布和获取都是通过配置文件完成。服务的获取更像是spring中的IOC,在使用的时候由框架注入。服务规范:OSGI的server规范中定义了众多的服务,常用的服务: Log Server:用于以日志方式记录系统操作。 Http Server:要求至少实现se

19、rvlet2.1规范便于开发人员基于此服务对外提供简单的http访问。 Configuration Admin Server:用于管理各bundle或其它OSGI服务的配置信息。 Declarative Server:可以实现DI方式的OSGI服务注入,并且是动态的。 Event Admin Server:用于实现事件方式的通知。Equinox项目主页:http:/www.eclipse.org/equinox/目前发布版本:3.7 2011.6.13遵循标准:OSGi Release 4, version 4.2 specification实现了OSGI规范中所有方面。LicensesEcl

20、ipse license下载:整个SDK,大概20M左右(压缩后),包含二进制文件和源码,不含文档。官方文档提供的内容不多,基本是基于eclipse的在线文档和一些示例。http:/eclipse.org/equinox/documents/开发和调试:无需安装任何插件,直接用eclipse即可。运行:在外部可以使用命令行或者下载一个launcher来启动框架。Felix项目主页:http:/felix.apache.org/site/index.html包含很多个子项目,并不是作为单个项目开开发目前发布版本:Framework 3.2.2 2011.5.23遵循标准:OSGi Release

21、 4, version 4.2 specificationLicensesApache License, Version 2.0下载:核心框架和其它子项目的jar包被分开,每个子项目的jar都需要单独下载。核心框架总大小只几百K,轻量级框架。开发和调试: 安装eclipse插件http:/www.ops4j.org/pax/eclipse/update/ 在eclipse中新建工程,导入下载的源文件。运行:框架本身非常紧凑,你只需要3个包加一个shell就可以运行了功能需要扩展则加入其它的jar包文档:官方文档和例子详细,包含用户文档和开发文档,社区非常活跃。其它:Felix在OBR,即OSG

22、I的bundle仓库这一块做得非常非常好了。这一块预计在OSGI V5中发布!除了Felix,还有两个项目是和OSGi相关的。一个是Apache Felix Karaf,它本身是Felix的一个子项目,但他其实是封装了Felix提供更高一层的Runtime,例如提供了JAAS。提供了Web控制台对加入其中的bundle进行管理!另一个是Apache Aries,目前还处于起步阶段,它作为Felix的补充,提供OSGi企业级规范,包括JPA、JDBC、JTA、JNDI等等。Karaf提供了bundle的运行环境。还可以安装一个web控制台,使用浏览器进行控制浏览器中的控制界面Knopflerfi

23、sh官方网站:http:/www.knopflerfish.org/index.html目前发布版本:Knopflerfish 3.2 is released!2011.7.15遵循标准:OSGi Release 4, version 4.2 specification. LicenseBSD style license. Knopflerfish 3.X中包含的组件:Knopflerfish OSGi framework - OSGi R4 v 4.2 Core Specification implementation Knopflerfish OSGi bundles - OSGi R4

24、v 4.2 Service Compendium implementation Knopflerfish components & extras - Knopflerfish bundles and utilitiesService Compendium部分没有完全实现。安装Knopflerfish至少java1.2.2下载jar包直接运行即可解压得到,包含源代码,二进制文件,例子和文档。框架默认属性设置在props.xargs 文件中。运行Knopflerfish直接点击OSGI目录下framework.jar文件即可运行或者使用命令行参数: cd osgi java -jar framew

25、ork.jarKnopflerfish提供了可视化操作界面创建bundles有三种方式创建我们自己的bundles用Eclipse用eclipse,需要安装eclipse插件http:/www.knopflerfish.org/eclipse-update/详情参考:Knopflerfish Eclipse Plugin用Ant用Maven实际开发中推荐使用eclipse插件,以便快速高效开发。例子:两个数计算服务此示例开发调试环境基于eclipse3.5。通过BundleContext在代码中注册和获取服务的方式不推荐使用,所以使用R4规范中的DS服务。设置开发调试环境:Run-run co

26、nfigurationOSGI Framework哪里新建一个运行配置,选中右边Bundles标签,打开Target Platform,勾选住图中的4个bundles,其中的org.eclipse.equinox.ds为支持ds服务的bundle,另外的三个为框架运行所需bundle。配置完成后点击run按钮,看到控制台输出如下信息表示环境配置成功。输入ss表示框架启动成功。键入help可以得到帮助信息接口定义:在例子中,我们定义一个用于计算的接口新建一个plug-in 项目使用标准OSGI框架填写bundle相关的描述信息,注意,这里选择不生成Activator点击finish,在src下面

27、新建一个包ds.calculate,包中建一个接口Calculator接口中只有一个方法:package ds.calculate;publicinterface Calculator public String excute(float first, float second); 打开META-INF文件夹下面的MANIFEST.MF文件选择runtime,在Exported Packages哪里导出刚才创建的包,不要忘了保存。这时候可以查看源文件,里面包含了bundle相关信息,刚才的操作也反应到文件里至此,我们完成了第一个bundle。接下来我们实现这个接口。接口实现:新建一个plug-

28、in 项目,由于是使用DS,所以也不需要生成Activator。这里实现一个加的操作。完成后打开MANIFEST.MF文件,选择Dependencies,添加刚才的接口bundle。注意保存。新建包和类实现接口。package ds.calculate.addserver;import ds.calculate.Calculator;publicclass AddServerImp implements Calculator Overridepublic String excute(float first, float second) System.out.println(你正在使用加法服务:

29、); return String.valueOf(first+second); 新建文件夹OSGI-INF,在文件夹里新建文件选中接口的实现类:打开component.xml文件发布刚才的服务,注意这里使用的是接口。查看源文件,类似于这个样子:点击finish,这时候再来看MANIFEST.MF文件,多了一行:获取服务:新建一个plug-in 项目,注意也不需要生成Activator同样先导入必须的bundle,这里即为接口。创建包和类来使用服务:package ds.calculate.consumer;import ds.calculate.Calculator;publicclass C

30、onsumer private Calculator server; publicvoid printNumber() System.out.println(server.excute(10, 20); publicsynchronizedvoid setServer(Calculator server) this.server = server; System.out.println(服务被设置!); System.out.println(使用服务!); printNumber(); publicsynchronizedvoid unsetServer(Calculator server) if (this.server = server) this.server = null; System.out.println(服务被解设置!); 新建文件夹OSGI-INF

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1