• 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 END bing.chen2@hp.com