- 1. Chen Bing(bing.chen2@hp.com)
DIT-JAVA
2011.10.12OSGi框架入门介绍
- 2. 大纲简介
OSGi介绍
OSGi开源实现
Apache Felix介绍
Code
- 3. OSGi 为基于组件或服务的开发提供了一套通用和标准的规范集,
通过 OSGi 可以轻松实现组件或服务之间信息的隐藏和共享,
从而构建高度模块化和动态性的系统。简介
- 4. 在OSGi中,模块是什么?
模块之间的类是如何做到隔离的?
怎么访问其他模块中的类?
模块的生命周期是怎么样的?
模块之间怎么交互?
OSGi提供了哪些常用的Service?
OSGi介绍
- 5. 模块化
独立,不受其他模块的影响;
其他模块只能访问该模块对外提供的功能;
模块具备独立的生命周期,例如启动、停止、更新等。
动态化
能动态的增加、更新或删除模块,而对于模块来说不需要做额外的处理;
OSGi-模块化与动态性的终结者
- 6. 一个标准,基于此标准实现的框架可轻松的构建模块化、动态化的系统;
Dynamic Module System For Java;
JSR 232、JSR 291;
众多Java Application Server(Weblogic、Glassfish 、JBOSS AS7 、Virgo等)所选择的底层框架;
OSGi是什么
- 7. 框架从功能上分为下面几个层次:
•安全层 Security Layer
•模块层 Module Layer
•生命周期层 Life Cycle Layer
•服务接口层 Service Layer
•服务实现层 Actual ServiceOSGi功能划分
- 8. Bundle是OSGi中部署的最小单位,因此可以认为Bundle就是模块;
Bundle就是一个普通的jar包,只是其在MANIFEST.MF中加入了一些特殊的头信息,例如Bundle-Name , Import-Package , Export-Package ;
Bundle
- 9. Java ClassLoader机制
类由ClassLoader来实现加载,Java动态化实现的基础;
默认情况下有BootStrap ClassLoader(jre/lib、jre/classes)、
Extension ClassLoader(jre/lib/ext)以及System ClassLoader(-classpath指定)三个级别的ClassLoader;
应用可自行实现ClassLoader以动态的加载类,或加载相应目 录下的类;
Bundle类隔离机制
- 10. 每个Bundle均为独立的ClassLoader,典型的Bundle的ClassLoader结构如下所示:
Bundle类隔离机制
- 11. Java经典的Delegation模型
在寻找类时首在parent ClassLoader中寻找,如找不到才在当前ClassLoader中寻找;
Bundle类共享机制
- 12. Bundle类共享机制Bundle类加载过程
java.*委派给parent classloader加载;
bootdelegation参数中配置的也委派给parent classloader加载,在parent classloader中未找到也继续下面的步骤;
是否在Import-Package中,在则委派给Export-Package的bundle的classloader;
是否在Require-Bundle中,在则委派给相应的Bundle ClassLoader,未找到则继续下面步骤;
在Bundle-Classpath中寻找,未找到则继续下面的步骤;
在fragments bundle的classpath中寻找,未找到则继续下面的步骤;
是否在Export-Package中,未找到则继续下面的步骤;
是否在DynamicImport-Package中,在则委派给相应的Bundle ClassLoader寻找,不在则抛出ClassNotFound异常。
- 13. 因此可以通过在MANIFEST.MF中定义Require-Bundle、Import-Package、Export-Package以及DynamicImport-Package来实现类共享;
Import-Package: org.bob.osgi.demo
Export-Package: org.bob.osgi.demo
DynamicImport-Package: org.bob.osgi.*
注意:OSGi支持包的版本的定义!
Import-Package: org.bob.osgi.demo;version=“[1.0,2.0)”;
Bundle类共享机制
- 14. Bundle生命周期OSGi按照下面的状态转换方式来管理Bundle的生命周期;
可通过OSGi提供的API来主动改变Bundle的生命周期。
BundleContext.installBundle
Bundle.start
Bundle.update
Bundle.stop
Bundle.uninstall
Bundle生命周期改变时所做的动作将直接影响动态化。
- 15. Bundle交互直接类访问的方式
Service交互方式
直接通过BundleContext.getServiceReference以及BundleContext.registerService这样的方式(使用不方便,不推荐);
Blueprint Container方式,类似Spring ioc;BundleJAVAOperating SystemHardwareOSGi FrameworkService
registrypackagespackagesBundle
- 16. Blueprint Container(Spring DM)
需要对外提供的功能均定义为接口;
接口的实现定义以XML方式定义为Bean;
按接口的方式访问其他Bundle的功能;
以XML方式定义对其他Bundle的功能的访问;
Bean也是有生命周期的。
Bundle交互
- 17. 对外提供服务示例
调用其他Bundle的服务示例Bundle交互
- 18. Http Service
以便支持简单的通过http访问OSGi应用;
但复杂的场景还是比较难支撑,这主要是由于目前还只有jetty实现的HttpService,再加上它所支持的Servlet版本太低,这也导致了目前OSGi对于Web类型的应用而言支持不足,但可喜的是Gemini Web(rfc66)给web开发带来了福音;
Log Service
支持简单的日志记录,直接输出到console,不过可以结合log4j自行实现;
EventAdmin Service
基于此可实现事件通知性质的功能;
ConfigurationAdmin Service
基于此可实现配置信息的动态管理。
OSGi提供的服务
- 19. 目前开源界主要的参考实现?
他们遵循OSGi规范的标准版本?
OSGi开源实现
- 20. Eclipse Equinox
Equinox最新版已经实现了R 4.3版本规范,并且也是Eclipse的核心,可谓是久经考验,Virgo OSGi Runtime也是基于Equinox
Apache Felix
Felix作为后起之秀,表现算得上是非常突出了,官网最新发布的Felix Framework Distribution4.0.0也通过R4.3的基准测试,配套的它还提供了http service,config ,event等标准服务,及command console和web console管理工具。OSGi开源参考实现
- 21. Knopflerfish
KF的最新版本3.2还只支持R4.2规范,它提供一个比较有特色的图形界面管理控制台,以及丰富的标准服务实现。
JBoss OSGi
JBoss OSGi 是 JBoss 组织实现的 OSGi 框架,它提供了在JBoss应用服务器上的 OSGi 4.2 框架,其主要的目的包括如下两个方面: 1. 为第三方的 OSGi 框架提供一个集成的平台; 2. 基于 JBoss 微容器提供一个 OSGi 兼容框架
OSGi开源参考实现
- 22. 如何启动Felix?
如何配置Felix?
如何通过Gogo控制台来管理bundle?Apache Felix介绍
- 23. 通过在安装目录输入下面的命令启动框架:
>java -jar bin/felix.jar [cache-path]默认felix-cache
Felix启动
- 24. Felix和启动器都是使用配置属性来改变它们默认的行为,通过配置属性文件来配置它们,框架启动器从conf/config.properties文件中读取属性,该文件采用Java Properties标准句法。
启动器也可以通过conf/system.properties文件来读取系统属性,您可以在启动时通过 felix.config.properties 和felix.system.properties 参数来指定属性文件。例如:java -Dfelix.config.properties=file:/home/rickhall/config.properties -jar bin/felix.jar 可以通过运行时调用BundleContext.getProperty()函数来获得属性设置内容。另外,系统属性会覆盖配置属性。
Felix框架配置
- 25. 与框架交互的主要方法是由Apache提供的Felix Gogo Shell。在框架启动后,键入help命令可以显示所有命令,也可以通过help 来查看某一个命令的帮助信息。
安装Bundle,使用命令 felix:install 命令。列出安装的Bundle,可以用命令lb;停止框架的运行,可以使用 stop 0 命令来停止System budle。安装的Bundle会被部署在Bundle缓存目录,在下一次启动时,会从缓存目录中提取该Bundle。
Gogo Shell介绍
- 26. felix:install 命令接着Bundle的URL来安装Bundle,例如:安装一个 bundle.jar ,您可以键入:felix:install file:/path/to/bundle/bundle.jar;
felix:start命令加上Bundle标识符来启动Bundle,加一个URL来一步完成安装和启动一个Bundle;
felix:stop 命令用于停止Bundle;
felix:uninstall 命令用于从Bundle缓存中移除一个Bundle;
felix:update 命令来更新一个Bundle,更新命令允许您用一个URL指定从哪里更新Bundle,但如果未指定,会从Bundle-UpdateLocation 描述属性中描述的地址进行更新,或从原始地址更新。Bundle生命周期管理
- 27. THE ENDbing.chen2@hp.com