服务任务被用作调用服务。在camunda中,可以通过调用Java代码,或者提供一个外部的异步工作项,或者调用一个通过webservices实现的逻辑。
一、调用Java代码(Calling Java Code):
有四种方式声明调用Java逻辑:
- 指定一个实现了JavaDelegate或者ActivityBehavior接口的类
- 对解析为委托对象的表达式求值
- 调用一个方法表达式
- 解析一个值表达式
1.指定一个类: 指定一个在流程执行时调用的类,需要指定合法的类名,并设置在camunda:class属性中
<serviceTask id="javaService"
name="My Java Service Task"
camunda:class="org.camunda.bpm.MyJavaDelegate" />
2.使用委托表达式(delegateExpression): 也可以使用解析为对象的表达式。该对象必须遵循与使用camunda:class属性时创建的对象相同的规则。
<serviceTask id="beanService"
name="My Bean Service Task"
camunda:delegateExpression="${myDelegateBean}" />
3.使用表达式,调用方法或者解析成一个值:
<serviceTask id="expressionService"
name="My Expression Service Task"
camunda:expression="${myBean.doWork()}" />
也可调用以webservices方式实现的逻辑。camunda:connector属性允许工作流直接调用REST/SOAP API。
二、服务任务的结果(Service Task Results):
服务执行返回的结果(对于仅仅使用表达式的服务任务)可以通过指定流程变量的名字给camunda:resultVariable属性,来将值分配给一个已经存在的或者新的流程变量(camunda:resultVariable的值作为变量名称),这个流程中,如果之前存在这个流程变量,这个流程变量的值将会服务任务执行的返回的值覆盖。如果没有指定变量名,执行的结果将会被忽略掉。
<serviceTask id="aMethodExpressionServiceTask"
camunda:expression="#{myService.doSomething()}"
camunda:resultVariable="myVar" />
上面的例子,当服务执行完成后,执行的结果(调用myService.doSomething()方法的返回值)被设置给名字叫myVar的流程变量 如果在多实例结构中使用camunda:resultVariable属性,例如多实例子流程,这个变量结果在每次任务结束的时候,都会被重写,这会导致这边变量看起来像是随机的一样。
三、外部任务(External Tasks):
与调用Java代码相比,流程引擎同步调用Java逻辑的地方,也可以在流程引擎之外以外部任务的形式实现服务任务。当服务任务被声明成外部的,流程引擎向独立轮询引擎以完成工作的工人提供工作项目。这将task的实现和流程引擎解耦了,并且允许跨越技术和系统的边界。 声明一个外部的服务任务,camunda:type属性的值要设置为external,并且camunda:topic属性需要指定一个外部的task topic。例如:下面是一个xml片段定义了一个topic为ShipmentProcessing的外部服务任务
<serviceTask id="anExternalServiceTask"
camunda:type="external"
camunda:topic="ShipmentProcessing" />
具体使用参考用户指南的外部任务部分