OGSI规范中关于ServiceData部分的内容.docx
《OGSI规范中关于ServiceData部分的内容.docx》由会员分享,可在线阅读,更多相关《OGSI规范中关于ServiceData部分的内容.docx(21页珍藏版)》请在冰点文库上搜索。
![OGSI规范中关于ServiceData部分的内容.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/b984d726-ed20-47ef-a71d-182da7aa9896/b984d726-ed20-47ef-a71d-182da7aa98961.gif)
OGSI规范中关于ServiceData部分的内容
OGSI规范中关于ServiceData部分的内容
服务数据
译者:
岳峰同济大学计算机系
papaya@ papaya@
为了实现OGSI中提出的有状态的Web服务,需要有一种通用的机制,使得服务的请求者可以对服务实例的状态数据进行查询、更新和当这些数据发生变化时收到相应的通知。
这里使用“服务数据”(serviceData)来表示这些体现服务实例状态的数据。
由于这个概念对于任何Web服务都适用而并不只适用于网格应用,因此我们提出一种展现Web服务的状态数据,也就是服务数据的通用的方法。
我们也正致力于将这个概念在整个Web服务领域中推广。
在对一个有状态的Web服务(也就是网格服务)的接口进行进行完整的描述时,也应该对这个服务中向外界表示其状态的元素进行描述。
向外界表示状态,指的是在服务本身的内部实现不考虑具体的客户端的情况下,通过预先声明的服务的接口向服务的客户端展示服务的状态。
将服务数据作为服务对外接口的一部分紧盯声明,大致相当于在面向对象的接口定义语言(IDL)中将对象的属性作为面向对象接口的一部分进行声明。
对外展示的服务数据可供用于读取、更新或者作为发送消息通知的依据。
在WSDL中已经为每个portType定义了相应的操作和消息,因此外界对服务状态的访问只能通过在服务的接口中定义的服务操作进行。
为了避免对每一个服务数据元素都定义特定的服务数据操作,在所有网格服务都必须实现的接口GridServiceportType中提供了通过名称处理服务数据的基本操作。
例如接口foo中有三个操作op1、op2和op3。
同时这个接口中还有三个可以被外界访问的数据元素de1、de2和de3。
在描述foo接口时可以使用标准的WSDL描述它的操作,而使用OGSI中对WSDL在服务数据方面的扩展部分表述接口foo中的状态de1、de2和de3是否可以被外界全部或部分地访问。
实现了这样定义的接口的有状态服务实例,将可以简化与服务状态有关的操作的执行过程。
简单的说,对于服务数据的声明,就是将服务中表示其对外可访问的服务状态的元素作为服务接口的一部分进行描述的机制。
可以通过服务接口中的操作,例如本规范中所定义的操作,对服务数据元素进行访问。
而服务的私有的内部状态不作为服务接口的一部分,因此不会通过服务数据的声明而对外展现。
1、产生动机与JavaBean属性的比较
OGSI规范引进服务数据的概念,目的是提供一种灵活的,以属性的形式对Web服务的状态数据进行访问的方式。
这个概念与Java,C++和Smalltalk等面向对象语言中的具有public属性的实例变量或字段有相似之处。
服务数据也类似于JavaBean中的属性(properties)。
JavaBean模型中规定了访问相应属性的方法的命名法则(getXXX/setXXX)以及说明相应属性的辅助类(BeanInfo)。
而在OGSI中,使用服务数据元素和XMLschema中的类型来达到类似的目的。
尽管在服务的具体实现时可以使用类似于getXXX和setXXX的方法安全明确地访问某个服务数据元素,但在OGSI规范中没有这样的要求,而是为查询(相当于get)、更新(相当于set)和订阅服务数据元素变更通知定义了具有扩展性的操作。
OGSI要求这些操作支持简单的表达式参数,根据服务数据元素的相对于服务实例的名称进行访问。
这种将名称作为参数的操作可以提供与JavaBean和EJB程序员所熟悉的getXXX和setXXX方法几乎一样的功能。
另外,这种OGSI操作还可以被服务的其他接口所扩展,以支持更丰富的查询、更新和订阅语义,例如在某个服务实例中对多个服务数据元素进行复杂的复合查询。
在网格的基本portType中定义了一个名为serviceDataName的数据元素。
这个元素相当于JavaBean中的BeanInfo类。
不同之处在于OGSI中以XML(WSDL)文档的格式提供这个元素的相关信息,而在BeanInfo模型中则是使用一个可序列化的类来实现。
2、带有服务数据的portType的扩展
服务数据定义了一个新的portType子元素serviceData,用于定义该portType相关的服务数据元素,或者说SDE。
这些服务数据元素的定义同时也作为服务数据声明被引用(SDD)。
用static标记的服务数据元素,可以在portType中通过staticServiceDataValues元素来指定其初始值。
所有服务数据元素的值,无论是在portType中静态声明的还是在Web服务实例的运行期间赋予的值,都被称作服务数据元素值或者SDE值。
在使用gwsdl:
portType时,其中也允许出现来自其他命名空间的元素。
portTypename="NCName">
documentation..../>
operationname="NCName">
…
serviceDataname="NCName"…/>
staticServiceDataValues>
staticServiceDataValues>
…
portType>
例如,下面的portType声明了两个服务数据元素,全名分别为“tns:
sd1”和“tns:
sd2”。
任何实现该portType的服务,都必须在其服务状态中包含这两个服务数据元素。
definitionsxmlns:
tns=”xxx”targetNamespace=”xxx”>
portTypename="exampleSDUse">
operationname=…>
…
serviceDataname="sd1"type=”xsd:
String”
mutability=”static”/>
serviceDataname="sd2"type=”tns:
SomeComplexType”/>
…
staticServiceDataValues>
sdl>initValue
sd1>
staticServiceDataValues>
portType>
…
definitions>
2.1服务数据的声明结构
声明服务数据的元素中所需的字段和XMLSchema中的xsd:
element中使用的字段非常相似,因此对后者稍作修改使其可用于服务数据元素的声明。
另外还明确规定了每个服务数据元素只能包含下述属性:
xsd:
element中的annotation,name,type,minOccurs,maxOccurs,nillable;OGSI扩展的mutability和modifiable,以及内容模型中的开放属性。
…
targetNamespace=
“http:
//www.gridforum.org/namespaces/2003/serviceData”
xmlns:
sd=
“http:
//www.gridforum.org/namespaces/2003/03/serviceData”
…
complexTypename=“ClosedServiceDataElementType”mixed=”true”>
complexContent>
restrictionbase=”xsd:
element”>
sequence>
elementref="xsd:
annotation"minOccurs="0"/>
sequence>
attributename="name"type="xsd:
NCName"/>
attributename="type"type="xsd:
QName"/>
attributeGroupref="xsd:
occurs"/>
<--minOccurs,maxOccurs-->
attributename="nillable"type="xsd:
boolean"
use="optional"default="false"/>
restiction>
complexContent>
complexType>
complexTypename=”ServiceDataType”mixed=”true”>
complexContent>
extensionbase=”sd:
ClosedServiceDataElementType”>
sequence>
anynamespace="##other"minOccurs="0"
maxOccurs="unbounded"/>
sequence>
attributename="mutability"default=”extendable”>
simpleType>
restrictionbase="xsd:
string">
enumerationvalue="static"/>
enumerationvalue="constant"/>
enumerationvalue="extendable"/>
enumerationvalue="mutable"/>
restriction>
simpleType>
attribute>
attributename="modifiable"type=”xsd:
boolean”
default=”false”>
extension>
complexContent>
complexType>
ServiceDataType”/>
complexTypename=”ServiceDataValuesType”>
sequence>
anynamespace="##any"minOccurs="0"maxOccurs="unbounded"/>
sequence>
complexType>
type=”sd:
ServiceDataValuesType”/>
type=”sd:
ServiceDataValuesType”/>
各元素详解如下:
●maxOccurs=(非负整数|unbounded):
默认值为1
⏹该值表示在服务实例的服务数据值或者portType的静态服务数据值中该服务数据元素值的最大数目。
●minOccurs=非负整数:
默认值为1
⏹该值表示在服务实例的服务数据值或者portType的静态服务数据值中该服务数据元素值的最小数目。
⏹如果该值为0,表示该服务数据元素可选
●name=NCName和{targetnamespace}
⏹在wsdl:
definitions元素所定义的命名空间中,服务数据元素的名称必须在所有sd:
serviceData和xsd:
element元素中唯一。
⏹服务数据元素的名称和wsdl:
definitions元素定义的目标命名空间的组合得到该服务数据元素的QName,作为该服务数据元素的专用标识。
●nillable=布尔值:
默认为false
⏹表示该服务数据元素是否可以有空值,也就是属性xsi:
nil的值为true的值。
◆例如下面的服务数据声明:
string”
nillable=true”/>
◆可以有如下的合法SDE值:
nil=”true”/>
●type=QName
⏹定义服务数据元素值的XMLSchema类型
●modifiable=布尔值:
默认为false
⏹若为true,则允许服务的请求者在符合(minOccurs,maxOccurs)规定的值的数目和mutability属性的情况下,通过setServiceData操作直接更新改服务数据的值
⏹若为false,则该服务数据元素的值对于请求者来说是只读的。
但是它的值可以因为服务接口的其他操作的结果而改变。
●mutability=“static”|”constant”|”extendable”|”mutable”:
默认为extendable
⏹表示该服务数据元素的值是否可以改变及具体的改变方式。
●{非schema命名空间中的任意属性}
⏹允许将服务数据的属性声明为其他开放内容
●内容
⏹annotation
◆允许注释作为服务数据声明的子元素出现。
⏹开放的内容元素模型,任意XMLSchema之外的其他命名的元素都可以作为服务数据元素的子元素。
开放的内容元素模型,mutability和modifiable属性的定义是对xsd:
element的扩展。
另外,这样定义服务数据,可以使portType中的操作以符合服务数据声明的值作为参数。
2.2GridServiceportType中使用服务数据的例子
下面通过一个GridServiceportType中的例子来说明服务数据的使用。
在这个例子中服务数据的声明(非标准格式)如下:
definitions…
portTypename=”GridService”…>
operationname=…>
…
serviceDataname=”interface”type=”xsd:
QName”
minOccurs=”1”maxOccurs=”unbounded”
mutability=”constant”/>
serviceDataname=”serviceDataName”type=”xsd:
QName”
minOccurs=”0”maxOccurs=”unbounded”
mutability=”mutable”nillable=”false”/>
serviceDataname=”factoryHandle”
type=”ogsi:
HandleType”
minOccurs=”1”maxOccurs=”1”
mutability=”constant”nillable=”true”/>
serviceDataname=”gridServiceHandle”
type=”ogsi:
HandleType”
minOccurs=”0”maxOccurs=”unbounded”
mutability=”extendable”/>
serviceDataname=”gridServiceReference”
type=”ogsi:
ReferenceType”
minOccurs=”0”maxOccurs=”unbounded”
mutability=”mutable”/>
serviceDataname=”findServiceDataExtensibility”
type=”ogsi:
OperationExtensibilityType”
minOccurs=”1”maxOccurs=”unbounded”
mutability=”static”/>
serviceDataname=”terminationTime”type=”ogsi:
terminationTime”
minOccurs=”1”maxOccurs=”1”
mutability=”mutable”/>
serviceDataname=”setServiceDataExtensibility”
type=”ogsi:
OperationExtensibilityType”
minOccurs=”2”maxOccurs=”unbounded”
mutability=”static”/>
…
下面是GridService中一组服务数据元素值的例子。
…
xmlns:
crm=”http:
//gridforum.org/namespaces/2002/11/crm”
xmlns:
tns=”
xnlns=”
serviceDataValues>
interface>crm:
GenericOSPT
interface>
interface>ogsi:
GridService
interface>
serviceDataName>ogsi:
interface
serviceDataName>
serviceDataName>ogsi:
serviceDataName
serviceDataName>
serviceDataName>ogsi:
factoryHandle
serviceDataName>
serviceDataName>ogsi:
gridServiceHandle
serviceDataName>
serviceDataName>ogsi:
gridServiceReference
serviceDataName>
serviceDataName>ogsi:
findServiceDataExtensibility
serviceDataName>
serviceDataName>ogsi:
terminationTime
serviceDataName>
serviceDataName>ogsi:
setServiceDataExtensibility
serviceDataName>
factoryHandle>someURI
factoryHandle>
gridServiceHandle>someURI
gridServiceHandle>
gridServiceHandle>someOtherURI
gridServiceHandle>
gridServiceReference>…
gridServiceReference>
gridServiceReference>…
gridServiceReference>
findServiceDataExtensibility
inputElement=”ogsi:
queryByServiceDataNames”/>
terminationTimeafter=”2002-11-01T11:
22:
33”
before=”2002-12-09T11:
22:
33”/>
setServiceDataExtensibility
inputElement=”ogsi:
setByServiceDataNames”/>
setServiceDataExtensibility
inputElement=”ogsi:
deleteByServiceDataNames”/>
serviceDataValues>
2.3SDE值的可变性
服务数据元素声明中的可变性(mutability)这一属性表示该服务数据元素的值在其生命周期之中的变化情况。
●mutability=”static”:
表示该SDE在WSDL声明中(staticServiceDataValue)赋值且在portType的所有实例中都有效。
一个”static”的SDE相当于编程语言中的类的静态成员变量。
●mutability=”constant”:
表示该SDE在网格服务实例创建时赋值,且一旦赋值则在网格服务实例的整个生命周期中都不能更改。
●mutability=”extendable”:
表示已经在SDE值中的元素,在网格服务实例的生命周期剩下的部分中将一直作为该SDE值的一部分。
新的元素可以加入到SDE值中,但是一旦加入,就不能删除。
●mutability=”mutable”:
表示该SDE值中的任意元素都可以在任意时间删除,而其他元素同样也可以在任意时间加入。
这里所定义的功能不同于XMLSchema的元素定义中的”fixed”和”default”属性。
尽管XMLSchema中的fixed属性可以表示一个OGSI中的static值,但是在描述上述“可附加”或者“可变”等属性时就需要另外使用单独的可变性属性变量。
当mutability=”constant”时表示一旦赋值就不会再更改,尽管在服务描述中并不对其赋值,但是要求在运行期间得到初始化。
3服务数据值
每个服务实例都有一个相关的服务数据元素集合,其中有些服务数据元素在定义该服务接口的各个portType中定义,而另外一些服务数据元素则可能是在运行期间动态的添加进来的。
我们将与某个服务实例相关联的服务数据元素的集合称为该服务实例的服务数据集。
一个服务数据集也可以指在portType的继承层次关系中各个portType定义的所有服务数据元素的集合。
针对每个服务数据元素都必须有一个逻辑上的XML文件,其根元素为serviceDataValues,包含有这个服务数据元素的值。
前面已经给出了一个serviceDataValues元素的例子。
服务在实现的时候可以自由的选择如何存储它的SDE值。
例如可以不用XML文件而是使用实例变量来存储SDE值,需要时再将实例变量转换成XML文件或其他编码格式。
处理服务数据元素的各个操作的wsdl:
binding中规定了服务请求者和服务提供者之间数据的编码格式。
例如,某个binding可能会规定服务数据元素值以序列化的Java对象作为其编码格式。
3.1在PortType中定义SDE值的初始值
在portType中可以为其服务数据集中任一可变性(mutability)为”static”的服务数据元素深声明初始值,无论该服务数据元素是在当前portType中定义的,还是在当前portType所继承的某个portType中定义的。
初始值也可以在portType的继承层次中在多个portType中多次定义,只要服务数据元素的初始值总数没有超过该服