Oracle BPEL Workflow Service的“Human Task的数据交互”稍微有些复杂,有几个地方要注意,其基本处理思路围绕:数据类型和Message Type的声明;流程变量的声明;任务参数的定义;任务参数与流程变量之间的映射;任务提交后数据的处理和提取。
其基本关系如下图所示:
|
类型
|
说明
|
|
Schema
|
一般是在shema目录下的.xsd文件,用于声明流程中所涉及的数据类型
|
|
Client MessageType
|
一般是在bpel流程所对应的client partner link所对应的wsdl中声明,用于定义与外界交互的消息类型。
|
|
BPEL Variables
|
流程全局变量,可以是简单类型、复杂类型和消息类型
|
|
Customer Variable
|
开发人员自定义的流程变量,用于处理流程活动之间的数据交互和转换
|
|
Task Message Variable
|
每个Human Task都有产生一个全局的变量,用于索引到任务消息对象,从而可以在其它活动获取与此human task相关的一些信息,包括任务实例的状态信息、任务提交的数据等等。其中表单提交的数据,都会写在“/task:task/task:payload”这个元素下,比如“/task:task/task:payload/task:ApplyUser”。
|
|
Human Task Parameter
|
Human Task会声明当前任务相关的参数,这些参数需要在Display Form中被显示或引用。在BPEL流程中,每个Human Task的参数都需要告知其数据是从哪个bpel variable取值的(或者初始值为空)。
|
数据类型和MessageType的声明
在对数据类型的声明,一般在创建BPEL工程的时候会自动在Schema目录下生成一个,比如“VactationApplyProcess.xsd”文件,如下所示:
在VactationApplyProcess.xsd中默认会构造一个Request和Resonse元素,如下所示:(其中蓝色斜字体表示是为此流程扩展的)
<schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://xmlns.oracle.com/VacationApplyProcess"
xmlns="http://www.w3.org/2001/XMLSchema">
<element name="VacationApplyProcessProcessRequest">
<complexType>
<sequence>
<element name="input" type="string"/>
</sequence>
</complexType>
</element>
<element name="VacationApplyProcessProcessResponse">
<complexType>
<sequence>
<element name="result" type="string"/>
</sequence>
</complexType>
</element>
<element name="VacationApplyProcessForm">
<complexType>
<sequence>
<element name="Apply_User" type="string"/>
<element name="Apply_Reason" type="string"/>
<element name="Approve_Manager" type="string"/>
<element name="Approve_Comment" type="string"/>
<element name="Approve_Status" type="boolean"/>
</sequence>
</complexType>
</element>
<schema>
在与BPEL对应的VactationApplyProcess.wsdl文件中,则声明了MessageType:
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://xmlns.oracle.com/VacationApplyProcess"
schemaLocation="VacationApplyProcess.xsd" />
</schema>
</types>
<message name="VacationApplyProcessRequestMessage">
<part name="payload" element="client:VacationApplyProcessProcessRequest"/>
</message>
<message name="VacationApplyProcessResponseMessage">
<part name="payload" element="client:VacationApplyProcessProcessResponse"/>
</message>
<message name="VacationApplyProcessFormInputMessage">
<part name="payload" element="client:VacationApplyProcessForm"/>
</message>
当然,开发人员可以定义自己的schema。但定义的schem必须放于%Project_Home%/bpel目录下才能够被schema目录识别。
Process Variables的声明
为了便于对“请假单”流程中变量进行统一声明,声明了一个ApplyForm的variable,类型是MessageType,指明到刚刚在wsdl定义的message。其实,就是索引到我们在schema中声明的表单元素。
一般来讲,流程变量并不一定需要很多很复杂。因为Oracle BPEL在设计流程的时候,会为每一个Human Task产生一个相应的全局的variable,来绑定到其taskservice:taskMessage上,根据这个variable可以获取到客户端所提交进来的数据。
发表于 @ 2008年06月18日 22:46:00|评论(loading...)|收藏