1、描述

Web服务任务用于同步调用外部Web服务。

2、图形表示法

Web服务任务的可视化方式与Java服务任务相同。

flowable适合微服务吗 flowable 服务任务_BPM

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>