1、描述
Web服务任务用于同步调用外部Web服务。
2、图形表示法
Web服务任务的可视化方式与Java服务任务相同。
3、XML表示
要使用Web服务,我们需要导入其操作和复杂类型。这可以通过使用指向Web服务的WSDL的导入标签自动完成:
<import importType="http://schemas.xmlsoap.org/wsdl/"
location="http://localhost:63081/counter?wsdl"
namespace="http://webservice.flowable.org/" />
前面的声明告诉Flowable导入定义,但是它不会为你创建项目定义和消息。假设我们想要调用一个名为prettyPrint的特定方法,因此我们需要为请求和响应消息创建相应的消息和项目定义:
<message id="prettyPrintCountRequestMessage" itemRef="tns:prettyPrintCountRequestItem" />
<message id="prettyPrintCountResponseMessage" itemRef="tns:prettyPrintCountResponseItem" />
<itemDefinition id="prettyPrintCountRequestItem" structureRef="counter:prettyPrintCount" />
<itemDefinition id="prettyPrintCountResponseItem" structureRef="counter:prettyPrintCountResponse" />
在声明服务任务之前,我们必须定义实际引用Web服务的BPMN接口和操作。基本上,我们定义和接口和所需的操作。对于每个操作,我们重用以前定义的消息中和了。例如,下面的声明定义了计数器接口和prettyPrintCountOperation操作:
<interface name="Counter Interface" implementationRef="counter:Counter">
<operation id="prettyPrintCountOperation" name="prettyPrintCount Operation"
implementationRef="counter:prettyPrintCount">
<inMessageRef>tns:prettyPrintCountRequestMessage</inMessageRef>
<outMessageRef>tns:prettyPrintCountResponseMessage</outMessageRef>
</operation>
</interface>
然后,我们可以使用## WebService实现和对Web服务操作的引用来声明一个Web服务任务。
<serviceTask id="webService"
name="Web service invocation"
implementation="##WebService"
operationRef="tns:prettyPrintCountOperation">
4、Web服务任务IO规范
除非我们将简单的方法用于数据输入和输出关联(参见下文),否则每个Web服务任务都需要声明指定任务输入和输出的IO规范。这个方法非常简单,BPMN 2.0抱怨,对于我们的prettyPrint例子,我们根据之前声明的项目定义来定义输入和输出集合:
<ioSpecification>
<dataInput itemSubjectRef="tns:prettyPrintCountRequestItem" id="dataInputOfServiceTask" />
<dataOutput itemSubjectRef="tns:prettyPrintCountResponseItem" id="dataOutputOfServiceTask" />
<inputSet>
<dataInputRefs>dataInputOfServiceTask</dataInputRefs>
</inputSet>
<outputSet>
<dataOutputRefs>dataOutputOfServiceTask</dataOutputRefs>
</outputSet>
</ioSpecification>
5、Web服务任务数据输入关联
有两种指定数据输入关联的方法:
- 使用表达式
- 使用简单的方法
要使用表达式指定数据输入关联,我们需要定义源项目和目标项目,并指定每个项目的字段之间的相应分配。在下面的例子中,我们为项目分配了前缀和后缀字段:
<dataInputAssociation>
<sourceRef>dataInputOfProcess</sourceRef>
<targetRef>dataInputOfServiceTask</targetRef>
<assignment>
<from>${dataInputOfProcess.prefix}</from>
<to>${dataInputOfServiceTask.prefix}</to>
</assignment>
<assignment>
<from>${dataInputOfProcess.suffix}</from>
<to>${dataInputOfServiceTask.suffix}</to>
</assignment>
</dataInputAssociation>
另一方面,我们可以使用简单的方法,这更直接。所述sourceRef元件是可流动的变量名和targetRef元素是项定义的属性。在下面的例子中,我们分配前缀字段中的变量的值PrefixVariable,和后缀字段的变量的值SuffixVariable。
<dataInputAssociation>
<sourceRef>PrefixVariable</sourceRef>
<targetRef>prefix</targetRef>
</dataInputAssociation>
<dataInputAssociation>
<sourceRef>SuffixVariable</sourceRef>
<targetRef>suffix</targetRef>
</dataInputAssociation>
6、Web服务任务数据输出关联
有两种指定数据输出关联的方法:
使用表达式
使用简单的方法
要使用表达式指定数据输出关联,我们需要定义目标变量和源表达式。这个方法非常简单,类似于数据输入关联:
<dataOutputAssociation>
<targetRef>dataOutputOfProcess</targetRef>
<transformation>${dataOutputOfServiceTask.prettyPrint}</transformation>
</dataOutputAssociation>
或者,我们可以使用更直接的简单方法。所述sourceRef元素是项定义的属性和targetRef元件是可流动的变量名。这个方法非常简单,类似于数据输入关联:
<dataOutputAssociation>
<sourceRef>prettyPrint</sourceRef>
<targetRef>OutputVariable</targetRef>
</dataOutputAssociation>