网站地图
高级搜索
首页
技术论坛
博客
派计划
产品中心
资源中心
银弹在线
商城
goCom - SOA中国第一社区
SOA和WebService
|
面向构件
|
业务流程
|
EOS
|
综合技术
|
goCom吧
|
版务区
|
商务专区
SOA和WebService
|
面向构件
|
业务流程
|
EOS
|
综合
专家组计划
|
论坛版主计划
|
技术日讲师计划
Primeton EOS
|
Primeton BPS
OSOA专区
|
专题
|
技术日
|
活动
|
下载
推荐阅读
|
封面报道
|
特别报道
|
CIO锦囊
|
专栏
|
公司
|
银弹讨论
最新上架
|
银弹推荐
|
普通书籍
|
音像
|
护肤
|
生活
|
数码
goCom - 面向构件与SOA社区 讨论区
-
SOA和WebService
SOA综合
WebService
OSGI
ESB
SOA 我有话说
主题选项
点击展开
HOVER展开
--------
打印主题
[无发表权] 请登录或者注册
版主:
benja
yanfei
BlueDavy
个人资料
OSGi R4.2 public draft中新增加的Framework launch
#1楼
总分
42 分
财富
91
威望
21
排名
:(
段位
这是Lifecycle Layer中的最大改进,在之前的规范中只是简单的描述了下框架的启动和关闭,在制定了这个规范后,以后无论是启动equinox还是felix,都可采用同样的方式启动,详细的来看看,本文摘自《OSGi原理与最佳实践》。
首先来看看外部应用如何通过Framework的API来实现Framework的启动,来看张启动方法的时序图先:
这个时序图完整的说明了如何通过Framework的API来实现OSGi Framework的启动和停止:
n
调用FrameworkFactory的newFramework方法
所有OSGi的实现都必须实现FrameworkFactory接口,此接口中只有一个方法,即newFramework(Map configuration),外部容器在实例化FrameworkFactory实现对象上有两种做法:
A.
Class.forName(FrameworkFactory实现类).newInstance()
B.
通过Java 6中提供的ServiceLoader寻找并加载FrameworkFactory的实现类,使用方法为:
假设com.acme.osgi.Factory是FrameworkFactory的实现类,那么则在META-INF下新建services目录,在此目录下建立一个org.osgi.framework.launch.FrameworkFactory的文件,文件内容即为:com.acme.osgi.Factory,在程序中则这么编写来加载此FrameworkFactory实现类:
ServiceLoader<FrameworkFactory> sl=ServiceLoader.load(FrameworkFactory.class);
Iterator<FrameworkFactory> it=sl.iterator();
在创建了FrameworkFactory实现的实例后,就可调用newFramework方法了,newFramework方法中的Map参数为控制OSGi框架行为的一些配置项,关键的有:
n
org.osgi.framework.bootdelegation
配置哪些package需要从boot classloader中加载,配置的值可为com.acme.*或com.acme.services。
n
org.osgi.framework.executionenvironment
配置Framework执行所需的环境,例如J2SE-1.5。
n
org.osgi.framework.library.extensions
native code的扩展名配置,例如so,dll。
n
org.osgi.framework.startlevel
配置Bundle启动级别。
n
org.osgi.framework.storage
配置用于存储OSGi应用运行时的Bundle状态等信息的路径,当此路径不存在时,框架应负责进行创建,如创建失败则抛出异常。
n
org.osgi.framework.storage.clean
配置storage目录是否要清除,例如值配置为onFirstInit,意味着当Framework Bundle第一次初始化之前,storage目录将被清空,这个配置项的好处是可以控制Framework重启后是否需要根据上次运行时的状态来启动。
n
org.osgi.framework.system.packages
Framework的parent ClassLoader应对外export的packages。
n
org.osgi.framework.system.packages.extra
在上面的配置项的基础上增加了扩展属性的配置,例如:
org.osgi.framework.system.packages.extra=org.acme.foo;version=1.2
n
org.osgi.framework.bundle.parent
和equinox中的osgi.parentClassLoader属性的含义一样,用于控制boot classloader具体是哪个classloader,有四个可选的属性值:boot、app、ext、framework,含义和equinox完全相同。
根据需要给这些属性配置相应的值后,即可调用newFramework方法创建出Framework对象了。
n
调用Framework的init方法
在init方法中完成Bundle Context的创建以及Framework services的注入。
n
通过Framework获取BundleContext
n
安装Bundle
通过BundleContext.installBundle来安装需要的Bundle。
n
调用Framework的start方法
Framework将StartLevel service设置为指定的启动级别,从而促发已安装的所有的Bundle的resolve和启动。
n
调用Framework的waitForStop方法
调用此方法,等待Framework的停止运行。
按照以上说明,一个典型的基于OSGi R4.2规范的OSGi Framework的启动过程代码编写示例如下:
Map p=new HashMap();
p.put(“org.osgi.framework.storage”,System.getProperties(“user.home”)+File.separator+”osgi”);
FrameworkFactory factory=Class.forName(factoryClassName).newInstance();
Framework framework=factory.newFramework(p);
framework.init();
BundleContext context=framework.getBundleContext();
…//安装Bundles
framework.start();
framework.waitForStop();
对比Felix的启动代码,是不是觉得有点相似呢?
OSGi规范中对Framework的生命周期也做了详细的说明,图示如下:
具体来看看init、start以及stop Framework时会做哪些事情。
n
init
init后,需要做到以下效果:
启动事件分发处理功能;
配置好Security Manager;
StartLevel设置为指定的startlevel,默认为0;
创建可用的BundleContext对象;
所有安装的Bundles的状态均设置为INSTALLED;
Framework提供的services都可用;
Framework的状态为STARTING。
n
start
负责根据StartLevel启动相应的已安装的Bundle,如Bundle启动失败,则广播Framework.ERROR的事件,启动完毕后Framework的状态为ACTIVE。
n
stop
负责停止所有运行的Bundle,释放所有的资源,并将Framework的状态置为RESOLVED。
n
update
停止Framework,并给Framework.waitForStop方法返回STOPPED_UPDATE或STOPPED_BOOTCLASSPATH_MODIFIED事件值,然后应用代码应自行完成update处理。
在Framework规范中,OSGi还说明了Framework运行于多线程模式下,即所有Bundle都运行在各自的线程中,基于事件机制来响应其他Bundle的事件。
从以上改动来看,增加的
Framework
章节是最大的改动,
Framework
规范的制定吸取了
Felix
以及
Equinox
的优点,对于统一
OSGi Framework
的启动方式以及行为将起到很大的作用,尤其是对于嵌入
OSGi
框架的应用以及需要与其他容器集成的
OSGi
应用而言会有很大的帮助。
2009/6/3 8:45
锐捷工作流 - BPS Express产品发布,
免费下载
参与RIA产品调研 赢取goCom纪念T恤
普元SOA业务流程平台BPS 6.1即将发布
普元融资成功新闻发布会
Primeton EOS 产品下载
Primeton BPS 产品下载
[无发表权] 请登录或者注册
发表回复
账号
用户名
密码
登录
内容:
字体大小
xx-small
x-small
small
medium
large
x-large
xx-large
字体
Arial
Courier
Georgia
Helvetica
Impact
Verdana
字体颜色
#000000
#000033
#000066
#000099
#0000CC
#0000FF
#003300
#003333
#003366
#003399
#0033CC
#0033FF
#006600
#006633
#006666
#006699
#0066CC
#0066FF
#009900
#009933
#009966
#009999
#0099CC
#0099FF
#00CC00
#00CC33
#00CC66
#00CC99
#00CCCC
#00CCFF
#00FF00
#00FF33
#00FF66
#00FF99
#00FFCC
#00FFFF
#330000
#330033
#330066
#330099
#3300CC
#3300FF
#333300
#333333
#333366
#333399
#3333CC
#3333FF
#336600
#336633
#336666
#336699
#3366CC
#3366FF
#339900
#339933
#339966
#339999
#3399CC
#3399FF
#33CC00
#33CC33
#33CC66
#33CC99
#33CCCC
#33CCFF
#33FF00
#33FF33
#33FF66
#33FF99
#33FFCC
#33FFFF
#660000
#660033
#660066
#660099
#6600CC
#6600FF
#663300
#663333
#663366
#663399
#6633CC
#6633FF
#666600
#666633
#666666
#666699
#6666CC
#6666FF
#669900
#669933
#669966
#669999
#6699CC
#6699FF
#66CC00
#66CC33
#66CC66
#66CC99
#66CCCC
#66CCFF
#66FF00
#66FF33
#66FF66
#66FF99
#66FFCC
#66FFFF
#990000
#990033
#990066
#990099
#9900CC
#9900FF
#993300
#993333
#993366
#993399
#9933CC
#9933FF
#996600
#996633
#996666
#996699
#9966CC
#9966FF
#999900
#999933
#999966
#999999
#9999CC
#9999FF
#99CC00
#99CC33
#99CC66
#99CC99
#99CCCC
#99CCFF
#99FF00
#99FF33
#99FF66
#99FF99
#99FFCC
#99FFFF
#CC0000
#CC0033
#CC0066
#CC0099
#CC00CC
#CC00FF
#CC3300
#CC3333
#CC3366
#CC3399
#CC33CC
#CC33FF
#CC6600
#CC6633
#CC6666
#CC6699
#CC66CC
#CC66FF
#CC9900
#CC9933
#CC9966
#CC9999
#CC99CC
#CC99FF
#CCCC00
#CCCC33
#CCCC66
#CCCC99
#CCCCCC
#CCCCFF
#CCFF00
#CCFF33
#CCFF66
#CCFF99
#CCFFCC
#CCFFFF
#FF0000
#FF0033
#FF0066
#FF0099
#FF00CC
#FF00FF
#FF3300
#FF3333
#FF3366
#FF3399
#FF33CC
#FF33FF
#FF6600
#FF6633
#FF6666
#FF6699
#FF66CC
#FF66FF
#FF9900
#FF9933
#FF9966
#FF9999
#FF99CC
#FF99FF
#FFCC00
#FFCC33
#FFCC66
#FFCC99
#FFCCCC
#FFCCFF
#FFFF00
#FFFF33
#FFFF66
#FFFF99
#FFFFCC
#FFFFFF
范例 Example
[
更多...
]
版权归Primeton普元公司所有 沪ICP备05008205号
关于goCom
|
联系我们
|
联系普元
|
隐私权声明
|
XOOPS