相关文章推荐
不羁的松树  ·  MySQL子查询·  1 年前    · 
不拘小节的单车  ·  C# ...·  1 年前    · 

原标题:Camunda配置实现Http服务流程调用

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

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

返回值包含状态码、响应头和响应体。

A response contains the status code, response headers and body.

Parameter

Description

statusCode

Contains the status code of the response

headers

Contains a map with the HTTP headers of the response

response

Contains the response body

以下是完整的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}&amp;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、发起流程,输入流程变量,后面的服务节点需要这两个流程变量

2、提交流程后,查看流程图,HTTP服务节点已经成功执行了

3、查看表单中的流程变量,HTTP服务节点计算后的返回值已经成功写入了。

其它请参考:

开源流程引擎activiti、flowable、camunda哪个好

30分钟学会camunda安装部署和流程开发

开源流程引擎camunda与springboot和mysql的集成整合

camunda会签流程设计和实现原理解析 返回搜狐,查看更多

责任编辑:

声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
发布于: 北京市