网站地图
高级搜索
首页
技术论坛
博客
派计划
产品中心
资源中心
银弹在线
商城
goCom - SOA中国第一社区
SOA和WebService
|
面向构件
|
业务流程
|
EOS
|
综合技术
|
goCom吧
|
版务区
|
商务专区
SOA和WebService
|
面向构件
|
业务流程
|
EOS
|
综合
专家组计划
|
论坛版主计划
|
技术日讲师计划
Primeton EOS
|
Primeton BPS
OSOA专区
|
专题
|
技术日
|
活动
|
下载
推荐阅读
|
封面报道
|
特别报道
|
CIO锦囊
|
专栏
|
公司
|
银弹讨论
最新上架
|
银弹推荐
|
普通书籍
|
音像
|
护肤
|
生活
|
数码
goCom - 面向构件与SOA社区 讨论区
-
综合技术论坛
Share
Eclipse
RIA
数据库
Java
Wicket
企业应用
应用服务器
操作系统
平台厂商
主题选项
点击展开
HOVER展开
--------
打印主题
[无发表权] 请登录或者注册
版主:
hlstudio
rzg
yanfei
个人资料
Email
主页
Eclipse Equinox OSGI Declarative Service 实现分析
#1楼
总分
7739 分
财富
6596
威望
8229
排名
第 2 名
段位
Equinox项目是
Eclipse
开源组织提供的OSGi框架的实现。Equinox 的org.eclipse.equinox.ds项目提供了OSGi R4规范中的Declarative Service标准服务的实现。Declarative Service提供了基于OSGI平台之上的面向服务构件模型(Service-Oriented Component Model),也为在OSGI基础之上搭建
SOA
应用提供了可能。
背景信息
Equinox项目是
Eclipse
开源组织提供的OSGi框架的实现。
Eclipse
自3.0版本开始,其内核移植到OSGi框架上。通过OSGi框架强大的组件控制,交互和管理能力,再加上
Eclipse
插件的自有特点,
Eclipse
开源框架得到了跳跃式的发展。同时,OSGi规范得益于
Eclipse
IDE环境庞大的使用者,OSGi联盟也进入了快速发展时期。
Equinox
项目概述
Equinox项目包括OSGi R4版本规范核心框架的实现,一系列OSGi标准服务Bundle及运行基于OSGi的系统的一些基础构件。目前,Equinox项目包括OSGi核心框架的实现,OSGi标准服务Bundle实现,OSGi的服务器端(J2EE实现)应用,Equinox部署更新框架及一些研究方向(未成熟发布的构想如JMX管理,安全管理,面向方面的设计与应用等)。
Equinox Declarative Services(DS)
Equinox 的org.eclipse.equinox.ds项目提供了OSGi R4规范中的Declarative Service标准服务的实现,该组件由Prosyst公司提供实现。Declarative Service提供了基于OSGI平台之上的面向服务构件模型(Service-Oriented Component Model),也为在OSGI基础之上搭建
SOA
应用提供了可能。Declarative Service实现并没有包含在
Eclipse
的默认软件包中,需要从
Eclipse
的CVS中获取。代码位于:pserver:anonymous:dev.eclipse.org/cvsroot/eclipse路径下。
Equinox
在没有DS实现之前,对于服务的注册需要手工来做,如下面的代码:
service
=
new
HelloServiceImpl();
// register the service
context.registerService(HelloService.
class
.getName(),
service
,
new
Hashtable());
// create a tracker and track the service
helloServiceTracker
=
new
ServiceTracker(context, HelloService.
class
.getName(),
null
);
helloServiceTracker
.open();
// grab the service
service
= (HelloService)
helloServiceTracker
.getService();
service
.speak();
在提供了DS之后可以采用XML文件的方式来声明:
<?xml version="1.0" encoding="UTF-8"?>
<component name="HelloService">
<implementation class="com.primeton.osgi.HelloServiceImpl"/>
<service>
<provide inter/>
</service>
</component>
上面的XML文件声明了HelloService的构件,实现类是
com.primeton.osgi.HelloServiceImpl
,同时,声明了构件的服务接口为
com.primeton.osgi.HelloService
。如果不声明服务,当你使用类似下面的代码是查找不到服务的:
ServiceReference reference = context.getServiceReference(TestService.
class
.getName());
TestService service = (TestService)context.getService(reference);
service.test();
调用
BundleContext
的
getServiceReference
方法将返回空。
类似于
SCA
规范的构件装配模型,
Component
可以引用别的
Component
的服务。如我们声明一个
TestService
,
TestService
引用了
HelloService
。
<?xml version="1.0" encoding="UTF-8"?>
<component name="TestService">
<implementation class="com.primeton.osgi.TestServiceImpl"/>
<reference name="HelloService" inter bind="setHelloService" unbind="unsetHelloService" policy="dynamic"/>
<service>
<provide inter/>
</service>
</component>
是不是和
SCA
的装配模型描述文件有点相似呢?^_^
下面对Equinox的Declarative Service的实现进行一下分析。
加载ComponentDescriptor
首先,构件的描述文件是如何被加载的呢?加载由
org.eclipse.equinox.ds.tracker.BundleTracker
来实现。
BundleTracker
会遍历所有的
Bundle
处于
ACTIVE
状态的
Bundle,BundleTracker
回调
BundleTrackerCustomizer
的
addingBundle
方法,读取所有的
ComponentDescriptor
,并加入到异步工作队列
WorkQueue
中。
Resovle ComponentDescriptor
加入到异步队列中的
ComponentDescriptor
需要由
org.eclipse.equinox.ds.resolver. Resolver
进行解析,判断
Component
所依赖的服务构件是否都存在,并满足条件。然后创建
ComponentConfiguration
。
解析
Manifest Header
org.eclipse.equinox.ds.parser.Parser
会解析
Manifest
文件,读取
Manifest
文件中的
Service-Component
属性。代码如下:
private
ManifestElement[] parseManifestHeader(Bundle bundle) {
Dictionary headers = bundle.getHeaders();
String files = (String) headers.get(ComponentConstants.
SERVICE_COMPONENT
);
try
{
return
ManifestElement.
parseHeader
(ComponentConstants.
SERVICE_COMPONENT
, files);
}
catch
(BundleException e) {
Log.
log
(1,
"[SCR] Error attempting parse Manifest Element Header. "
, e);
return
new
ManifestElement[0];
}
}
因此,为了使Component的描述文件被加载,必须在Manifest文件中申明要加载的xml文件。如下所示:
Manifest-Version
: 1.0
Bundle-ManifestVersion
: 2
Bundle-Name
: Test Plug-in
Bundle-SymbolicName
: test
Bundle-Version
: 1.0.0
Service-Componen
: test.xml
Import-Package
: org.osgi.framework;
version
="1.3.0",
org.osgi.util.tracker;
version
="1.3.1"
Eclipse
-LazyStart
: true
解析ComponentDescriptor
org.eclipse.equinox.ds.parser.Parser
同时会负责解析构件描述文件。
创建
Component
实例
org.eclipse.equinox.ds.instance.BuildDispose
负责根据
ComponentDescriptor
创建
Component
的实例。具体参见
buildComponentConfigInstance
方法。
ComponentDescription componentDescription = componentConfiguration.getComponentDescription();
Object instance = createInstance(componentDescription);
componentInstance = instantiate(componentConfiguration, instance);
createComponentContext(usingBundle, componentInstance);
bind(componentInstance);
activate(componentInstance);
componentConfiguration.addInstance(componentInstance);
1.
首先从ComponentConfiguration中获取ComponentDescriptor.
2.
根据ComponentDescritptor创建一个Component的实例。
3.
创建Component的上下文ComponentContext。
4.
将Component需要的Service进行绑定。
5.
调用Component的activate方法,激活Component。
Component可以是任何一个Java类,而不需要继承或实现OSGI的类或接口,但可以定义一个activate方法,在Component被激活时作相关处理。
org.eclipse.equinox.ds.instance.InvokeMethod
负责在调用
Component
的相关方法,采用类反射的机制将
Server
绑定到
Component
上。
InvokeMethod
的
findBindOrUnbindMethod
会在
Component
的实现类和超类中去查找绑定方法。
从以上分析,可以看出
Equinox
的
Declarative Service
实现了一个服务构件定义、加载、装配、服务查找的一个服务构件运行环境。和
SCA
的构件装配模型异曲同工。
Declarative Service
规范应该早于
SCA
规范的制定,因此,在某种程度上,
SCA
装配模型参考了
Declarative Service
的服务构件模型,并在此基础上发展完善,多出了
Contribution
、
Composite
等概念,对于服务绑定的范畴也进行了拓宽,并不局限于
Java
语言的
Service
,从而做到了语言无关、平台无关。
2007/11/26 10:48
锐捷工作流 - BPS Express产品发布,
免费下载
参与RIA产品调研 赢取goCom纪念T恤
动量ODE
普元SOA业务流程平台BPS 6.1即将发布
普元融资成功新闻发布会
Primeton EOS 产品下载
Primeton BPS 产品下载
tiebanliji
个人资料
Re: Eclipse Equinox OSGI Declarative Service 实现分析
#2楼
初级会员
学习中
2007/11/27 9:22
锐捷工作流 - BPS Express产品发布,
免费下载
参与RIA产品调研 赢取goCom纪念T恤
动量ODE
普元SOA业务流程平台BPS 6.1即将发布
普元融资成功新闻发布会
Primeton EOS 产品下载
Primeton BPS 产品下载
wangfeng
个人资料
Re: Eclipse Equinox OSGI Declarative Service 实现分析
#3楼
总分
1899 分
财富
1524
威望
2060
排名
第 15 名
段位
好,学习ing
2007/11/27 18:01
锐捷工作流 - BPS Express产品发布,
免费下载
参与RIA产品调研 赢取goCom纪念T恤
动量ODE
普元SOA业务流程平台BPS 6.1即将发布
普元融资成功新闻发布会
Primeton EOS 产品下载
Primeton BPS 产品下载
tjlvan
个人资料
Re: Eclipse Equinox OSGI Declarative Service 实现分析
#4楼
总分
127 分
财富
135
威望
123
排名
:(
段位
支持啊
2007/11/30 15:06
锐捷工作流 - BPS Express产品发布,
免费下载
参与RIA产品调研 赢取goCom纪念T恤
动量ODE
普元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