1.声明
当前内容主要用于学习在SpringBoot中操作Activiti6工作流,一个基本的订单操作demo
流程:
- 选择订单
- 提交订单
- 确认订单
2.基本的pom依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.6.RELEASE</version><!-- 父类中的版本控制所有的依赖包的版本信息 -->
<relativePath />
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.activiti/activiti-spring-boot-starter-basic -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>6.0.0</version>
</dependency>
<!-- 添加web支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- <version>1.2.6.RELEASE</version> -->
</dependency>
<!-- 添加h2数据库支持 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.183</version>
</dependency>
<!-- 添加mysql数据库支持 -->
<!-- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId> <version>8.0.15</version> </dependency> -->
</dependencies>
3.开始编写工作流的xml配置文件
主要在Eclipse中的resources文件夹
中添加一个文件夹processes
,在当前的processes
中添加order-task-process.bpmn20.xml
添加如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples" >
<process id="orderTaskProcess" name="订单流程">
<startEvent id="orderStart" />
<sequenceFlow id="order-flow1" sourceRef="orderStart" targetRef="selectOrder" />
<userTask id="selectOrder" name="选择订单" activiti:assignee="admin" />
<sequenceFlow id="order-flow2" sourceRef="selectOrder" targetRef="conformOrder" />
<userTask id="conformOrder" name="确认订单" activiti:assignee="admin" />
<sequenceFlow id="order-flow3" sourceRef="conformOrder" targetRef="submitOrder" />
<userTask id="submitOrder" name="选择订单" activiti:assignee="admin" />
<sequenceFlow id="order-flow4" sourceRef="submitOrder" targetRef="orderEnd" />
<endEvent id="orderEnd" />
</process>
</definitions>
注意当前的内容中的必须实现首尾相连的链式执行流程,必须指定activiti:assignee="admin"
,即指定哪个人执行的流程(或者使用表达式方式)
4.基本demo
1.启动入口类
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.orm.jpa.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/*import org.springframework.data.jpa.repository.config.EnableJpaRepositories;*/
import com.hy.springboot.activiti6.service.OrderService;
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class SpringBootActiviti6App {
public static void main(String[] args) {
SpringApplication.run(SpringBootActiviti6App.class, args);
}
@Bean
public CommandLineRunner init(final OrderService orderService,final RepositoryService repositoryService, final RuntimeService runtimeService,
final TaskService taskService) {
return new CommandLineRunner() {
@Override
public void run(String... strings) throws Exception {
System.out.println(
"Number of process definitions : " + repositoryService.createProcessDefinitionQuery().count());
System.out.println("Number of tasks : " + taskService.createTaskQuery().count());
}
};
}
}
2.service层
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.hy.springboot.activiti6.dao.PersonRepository;
import com.hy.springboot.activiti6.pojo.Person;
@Service
public class OrderService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Transactional
// 为某个人开始activiti工作流程
public void startProcess() {
// 开启订单任务
/*
* Map<String, Object> variables = new HashMap<String, Object>();
* variables.put("username", username);
*/
runtimeService.startProcessInstanceByKey("orderTaskProcess");
}
// 获取需要指定的任务列表
@Transactional
public List<Task> getTasks(String username) {
return taskService.createTaskQuery().taskAssignee(username).list();
}
// 完成某个任务
@Transactional
public void completeTask(String taskId) {
taskService.complete(taskId);
}
}
3.controller层
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.hy.springboot.activiti6.dao.PersonRepository;
import com.hy.springboot.activiti6.pojo.Person;
import com.hy.springboot.activiti6.service.OrderService;
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
// 开启工作流任务
@RequestMapping(value = "/process", method = RequestMethod.GET)
public void startProcessInstance() {
orderService.startProcess();
}
// 完成工作流中的某项任务
@RequestMapping(value = "/complete", method = RequestMethod.GET)
public void completeTask(@RequestParam String taskId) {
orderService.completeTask(taskId);
}
// 获取当前的执行工作流的列表(即具有哪些未完成的工作流)
@RequestMapping(value = "/tasks", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public List<TaskRepresentation> getTasks(@RequestParam String username) {
List<Task> tasks = orderService.getTasks(username); // 获取某个人的执行任务流程的状态
List<TaskRepresentation> dtos = new ArrayList<TaskRepresentation>();
for (Task task : tasks) {
dtos.add(new TaskRepresentation(task.getId(), task.getName()));
}
return dtos;
}
static class TaskRepresentation {
private String id;
private String name;
public TaskRepresentation(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
上面的基本demo就是为admin这个用户开启任务的
,需要注意的是每次访问需要添加username=admin
才行
5.开启项目和测试
表示解析了xml文件为工作流程,并加载到h2内存数据库中去了
使用postman开始测试:
开启任务
完成任务:
再次完成任务
此时任务流程执行成功,但是缺点就是太简单,用户固定