Camunda中的Service Task(服务任务)用于调用服务。在Camunda中,可以通过调用本地Java代码、外部工作项、web服务形式实现的逻辑来完成的。
本文重点描述如何使用web服务实现Camunda服务调用,即如何使用camunda Connector连接器调用HTTP服务,本地Java代码和外部工作项后续文章中再详细介绍。
Camunda Connect提供HTTP和SOAP HTTP连接器。本示例演示了使用http连接器从Camunda BPM中的服务任务调用REST服务。
一、添加项目依赖
给项目中添加
camunda
connect
和
camunda spin
包依赖,重新启动
camunda Platform
。
<
dependency
>
<
groupId
>
org.camunda.bpm
</
groupId
>
<
artifactId
>
camunda-engine-plugin-connect
</
artifactId
>
<
version
>
7.15.0
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
org.camunda.bpm
</
groupId
>
<
artifactId
>
camunda-engine-plugin-spin
</
artifactId
>
<
version
>
7.15.0
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
org.camunda.spin
</
groupId
>
<
artifactId
>
camunda-spin-dataformat-json-jackson
</
artifactId
>
<
version
>
1.10.1
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
org.camunda.spin
</
groupId
>
<
artifactId
>
camunda-spin-core
</
artifactId
>
<
version
>
1.10.1
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
org.camunda.spin
</
groupId
>
<
artifactId
>
camunda-spin-dataformat-all
</
artifactId
>
<
version
>
1.10.1
</
version
>
</
dependency
>
二、设计流程图
以下时服务节点的关键配置项:
HTTP连接器可用于创建新请求、设置HTTP方法、URL、内容类型和有效负载。
The HTTP connector can be used to create a new request, set a HTTP method, URL, content type and payload.
Parameter
|
Description
|
method
|
Sets the HTTP method of the request
|
url
|
Sets the URL of the request
|
headers
|
Contains a map of the configured HTTP headers of the request
|
payload
|
Sets the payload of the request
|
以下是完整的BPMN模型文件:
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1qvw7a2" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.8.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0">
<bpmn:process id="Process_0a6gw7u" name="贷款申请流程HTTP" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_0kzdck2</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_0kzdck2" sourceRef="StartEvent_1" targetRef="Activity_0bvh293" />
<bpmn:sequenceFlow id="Flow_07gaddc" sourceRef="Activity_0bvh293" targetRef="Activity_0kimj7k" />
<bpmn:serviceTask id="Activity_0bvh293" name="贷款额度计算">
<bpmn:extensionElements>
<camunda:connector>
<camunda:inputOutput>
<camunda:inputParameter name="headers">
<camunda:map>
<camunda:entry key="Content-Type">text/plain</camunda:entry>
<camunda:entry key="Accept">application/json</camunda:entry>
</camunda:map>
</camunda:inputParameter>
<camunda:inputParameter name="method">POST</camunda:inputParameter>
<camunda:inputParameter name="url">http://127.0.0.1:8888/userLoan/computeLoan?yearWages=${yearWages}&houseAssets=${houseAssets}</camunda:inputParameter>
<camunda:outputParameter name="creditRating">
<camunda:script scriptFormat="JavaScript">var response = connector.getVariable("response");
var user = S(response);
var creditRating = user.prop("creditRating").stringValue();
creditRating;</camunda:script>
</camunda:outputParameter>
<camunda:outputParameter name="loanLimit">
<camunda:script scriptFormat="JavaScript">var response = connector.getVariable("response");
var user = S(response);
var loanLimit = user.prop("loanLimit").numberValue();
loanLimit;</camunda:script>
</camunda:outputParameter>
<camunda:outputParameter name="loanUser">${response}</camunda:outputParameter>
</camunda:inputOutput>
<camunda:connectorId>http-connector</camunda:connectorId>
</camunda:connector>
</bpmn:extensionElements>
<bpmn:incoming>Flow_0kzdck2</bpmn:incoming>
<bpmn:outgoing>Flow_07gaddc</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:userTask id="Activity_0kimj7k" name="确认贷款额度" camunda:assignee="demo">
<bpmn:incoming>Flow_07gaddc</bpmn:incoming>
<bpmn:outgoing>Flow_09mofy3</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_09mofy3" sourceRef="Activity_0kimj7k" targetRef="Event_0myx83u" />
<bpmn:endEvent id="Event_0myx83u">
<bpmn:incoming>Flow_09mofy3</bpmn:incoming>
</bpmn:endEvent>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_0a6gw7u">
<bpmndi:BPMNEdge id="Flow_09mofy3_di" bpmnElement="Flow_09mofy3">
<di:waypoint x="570" y="117" />
<di:waypoint x="662" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_07gaddc_di" bpmnElement="Flow_07gaddc">
<di:waypoint x="370" y="117" />
<di:waypoint x="470" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0kzdck2_di" bpmnElement="Flow_0kzdck2">
<di:waypoint x="215" y="117" />
<di:waypoint x="270" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0rfgq1k_di" bpmnElement="Activity_0bvh293">
<dc:Bounds x="270" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_16ovae8_di" bpmnElement="Activity_0kimj7k">
<dc:Bounds x="470" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0myx83u_di" bpmnElement="Event_0myx83u">
<dc:Bounds x="662" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
三、开发HTTP服务
1. 新建springboot工程,开发User类
import java.io.Serializable;
public class User implements Serializable {
private String userName; //姓名
private int userAge; //年龄
private double yearWages; //年薪
private double houseAssets; //房产
private String creditRating; //信用等级
private double loanLimit; //贷款额度
private String isTransferAccount; //是否已放贷
public String getUserName() {
return userName;
public void setUserName(String userName) {
this.userName = userName;
public int getUserAge() {
return userAge;
public void setUserAge(int userAge) {
this.userAge = userAge;
public double getYearWages() {
return yearWages;
public void setYearWages(double yearWages) {
this.yearWages = yearWages;
public double getHouseAssets() {
return houseAssets;
public void setHouseAssets(double houseAssets) {
this.houseAssets = houseAssets;
public String getCreditRating() {
return creditRating;
public void setCreditRating(String creditRating) {
this.creditRating = creditRating;
public double getLoanLimit() {
return loanLimit;
public void setLoanLimit(double loanLimit) {
this.loanLimit = loanLimit;
public String getIsTransferAccount() {
return isTransferAccount;
public void setIsTransferAccount(String isTransferAccount) {
this.isTransferAccount = isTransferAccount;
2. 开发REST服务类
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/userLoan")
public class UserLoanController {
@PostMapping("/computeLoan")
public User computeLoan(double yearWages,double houseAssets){
User user=new User();
user.setYearWages(yearWages);
user.setHouseAssets(houseAssets);
double sum = yearWages + houseAssets;
if(sum<=0){
user.setCreditRating("C");
user.setLoanLimit(0);
}else if(sum>0 && sum <=100){
user.setCreditRating("B");
user.setLoanLimit(sum*0.8);
}else if(sum>100){
user.setCreditRating("A");
user.setLoanLimit(sum*1.2);
return user;
四、发起流程测试
登录:http://localhost:8080/camunda/app/admin/default/#/login
1、发起流程,输入流程变量,后面的服务节点需要这两个流程变量
更多参考:
Camunda Connector Reference | docs.camunda.org
camunda-bpm-examples/servicetask at 7.15 · camunda/camunda-bpm-examples · GitHub
云程 | 云BPM,云程BPM,低代码平台,低代码开发平台,开源流程引擎,Camunda,flowable,业务流程管理,activiti,智能表单,电子表单,可视化开发,零代码开发,基础平台,流程PaaS,流程SaaS
send task 其实只是代表一个send动作,具体send什么camunda 不管。
send 一个Correlation message 可以触发创建一个以message start event 开始的process instance,send message时候可以带上variables。
以下为一个send 类的代码,发送2个message
public class SendTask implements JavaDelegate {
private final Logger logger
Service Task、任务监听器和执行监听器都可执行调用Java 业务代码。
参考资料:
http://camunda-cn.shaochenfeng.com/user-guide/process-engine/delegation-code/服务任务 Class 配置的类,必须实现接口
org.camunda.bpm.engine.impl.pvm.delegate.ActivityBehavior; 功能大于JavaDelegate,用不好会出问题,小心使用。
org.camunda.bpm.
使用camunda-modeler工具画流程图
下载链接: https://pan.baidu.com/s/1y-Y8BZ0_YeemloY6F6XBFA
提取码: 18fk
2、流程图
1选择task类型
2设置回调
可以选择Java Class,也可选择Delegate Expression,由于我使用的是springboot,这里就选择了Delegate Expression
3、方法任务方法回调
需要实现org.camunda.bpm.engine.delegate.JavaDe