一、使用CAMUNDA流程设计器创建一个简单的流程
流程画完之后,将流程部署到我们的引擎中
二、要订阅流程的项目导入pom依赖
<!-- camunda外部任务客户端 -->
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-external-task-client</artifactId>
<version>${camunda.external-task-client.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
三、编写订阅外部任务代码
package com.gykalc.camundatestjava.camunda.shopping;
import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.client.ExternalTaskClient;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Map;
@Component
@Slf4j
public class SubscribeTask {
// 引擎端url前缀
private final static String CAMUNDA_BASE_URL = "http://localhost:8080/engine-rest";
private ExternalTaskClient client = null;
private ExternalTaskClient getClient() {
if (client == null) {
client = ExternalTaskClient.create()
.baseUrl(CAMUNDA_BASE_URL)
.asyncResponseTimeout(10000)
.build();
}
return client;
}
/**
* 处理加入购物车流程的外部任务
*/
@PostConstruct
public void handleShoppingCart() {
getClient().subscribe("add_shopping_cart") // 流程图中,外部任务的topic值
.processDefinitionKey("Process_shopping") // 流程图的ID
.lockDuration(2000)
.handler((externalTask, externalTaskService) -> {
log.info("订阅到加入购物车任务");
// 获取该外部任务的所有变量
Map<String, Object> allVariables = externalTask.getAllVariables();
/**
* 根据变量处理业务逻辑
*/
System.out.println(allVariables);
// 处理完成,调用service的completed方法,完成任务
externalTaskService.complete(externalTask, allVariables);
}).open();
}
/**
* 处理付款流程的外部任务
*/
@PostConstruct
public void handleShoppingPay() {
getClient().subscribe("shopping_pay") // 流程图中,外部任务的topic值
.processDefinitionKey("Process_shopping") // 流程图的ID
.lockDuration(2000)
.handler((externalTask, externalTaskService) -> {
log.info("订阅到付款任务");
// 获取该外部任务的所有变量
Map<String, Object> allVariables = externalTask.getAllVariables();
/**
* 根据变量处理付款逻辑
*/
System.out.println(allVariables);
// 处理完成,调用service的completed方法,完成任务
externalTaskService.complete(externalTask, allVariables);
}).open();
}
/**
* 处理发货流程的外部任务
*/
@PostConstruct
public void handleLogisticsDelivery() {
getClient().subscribe("logistics_delivery") // 流程图中,外部任务的topic值
.processDefinitionKey("Process_shopping") // 流程图的ID
.lockDuration(2000)
.handler(((externalTask, externalTaskService) -> {
Object toWhere = externalTask.getVariable("toWhere");
log.info("收到发货任务,目的地:{}", String.valueOf(toWhere));
/**
* 处理发货任务逻辑
*/
externalTaskService.complete(externalTask);
})).open();
}
}
四、引擎端编写一个接口,用来创建流程实例
package com.gykalc.workflow;
import org.camunda.bpm.engine.IdentityService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.runtime.ProcessInstance;
import org.camunda.bpm.engine.variable.VariableMap;
import org.camunda.bpm.engine.variable.Variables;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class Application {
@Autowired
private IdentityService identityService;
@Autowired
private RuntimeService runtimeService;
public static void main(String... args) {
SpringApplication.run(Application.class, args);
}
@GetMapping("/startProcess/{userId}/{processKey}")
public void startProcess(
@PathVariable String userId,
@PathVariable String processKey
) {
identityService.setAuthenticatedUserId(userId);
VariableMap variables = Variables.createVariables();
variables.put("price", 11.5);
variables.put("count", 10);
// 开启一个流程,并传递一些数据
runtimeService.startProcessInstanceByKey(processKey, variables);
}
}