0. 官网activiti7 新特性文档
因为activiti7 中文文档现在比较少,所以可以考虑去看英文文档。里面也有实例,比较详细。
本次文章分享 全程使用activiti7 新api 进行基本操作
1. 测试工程搭建
1.1 pom文件
这里是只作测试使用的坐标
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.activiti/activiti-spring-boot-starter -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.0.0.Beta2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
1.2 application.yml文件
部分配置文件的解释来源于互联网。并非本人书写。
spring:
datasource:
url: jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
activiti:
database-schema-update: true
#表示使用历史表,如果不配置,则工程启动后可以检查数据库,只建立了17张表,历史表没有建立
db-history-used: true
#记录历史等级 可配置的历史级别有none, activity, audit, full
history-level: full
#校验流程文件,默认校验resources下的processes文件夹里的流程文件
#如果设置false, 则resources/processes下面的bpmn文件不会自动部署
check-process-definitions: true
1.3 初始化文件的准备
- 这三个文件来源于如下文件(可在GitHub下载):
- GitHub例子网址 点击跳转
1.4 bpmn文件
1.5 特别注意
- 放在此目录下会自动部署流程。官方文档说明如第二张图
2. 测试代码
- 空的测试代码
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class TextActiviti {
@Autowired
private SecurityUtil securityUtil;
@Autowired
private ProcessRuntime processRuntime;
@Autowired
private TaskRuntime taskRuntime;
}
2.2 查询流程定义信息
/**
* 查询流程定义
*/
@Test
public void testQueryProcessDefinition() {
//1. 模拟登陆,因为activiti7与springSecurity有强耦合
securityUtil.logInAs("system");
//2. 查询
Page<ProcessDefinition> processDefinitionPage = processRuntime.processDefinitions(Pageable.of(0, 10));
for (ProcessDefinition processDefinition : processDefinitionPage.getContent()) {
System.out.println(processDefinition.getName());
System.out.println(processDefinition.getKey());
}
}
2.3 开始一个流程
代码,本人参考的官方文档
/**
* 启动一个流程实例
*/
@Test
public void testStartProcess() {
//1. 模拟登陆,因为activiti7与springSecurity有强耦合
// 参数可以在DemoApplicationConfiguration.java 文件中获得。因为这里是测试。并没有实际结合springSecurity
securityUtil.logInAs("erdemedeiros");
ProcessInstance processInstance = processRuntime
.start(ProcessPayloadBuilder
.start()
.withProcessDefinitionKey("testProcess")
// .withVariable("content", content) 可以设置流程变量
.build());
//输出基本信息
System.out.println(processInstance.getId());
System.out.println(processInstance.getName());
}
2.4 查询并拾取任务
代码,本人参考的官方文档
/**
* 测试查询并拾取任务
*/
@Test
public void testQueryAndClaimTask() {
//1. 模拟登陆,因为activiti7与springSecurity有强耦合
// 参数可以在DemoApplicationConfiguration.java 文件中获得。因为这里是测试。并没有实际结合springSecurity
securityUtil.logInAs("salaboy");
Page<Task> tasks = taskRuntime.tasks(Pageable.of(0, 10));
List<Task> tasksContent = tasks.getContent();
for (Task task : tasksContent) {
// 打印任务基本信息
System.out.println(task.getName());
System.out.println(task.getAssignee());
//拾取任务。
taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build());
System.out.println("拾取成功!");
}
}
- 此时可以观看数据库表
act_ru_task
中的assignee字段已经更新, 那么此用户组中的其他用户在进行查询的时候,此任务已经不会被其他人查询到。这里就不作测试了。
2.5 归还任务
/**
*测试归还任务
*/
@Test
public void testReleaseTask() {
//1. 模拟登陆,因为activiti7与springSecurity有强耦合
// 参数可以在DemoApplicationConfiguration.java 文件中获得。因为这里是测试。并没有实际结合springSecurity
securityUtil.logInAs("salaboy");
Page<Task> tasks = taskRuntime.tasks(Pageable.of(0, 10));
List<Task> tasksContent = tasks.getContent();
for (Task task : tasksContent) {
// 被"salaboy"拾取的
if ("salaboy".equals(task.getAssignee())) {
// 打印任务基本信息
System.out.println(task.getName());
System.out.println(task.getAssignee());
//归还任务
taskRuntime.release(TaskPayloadBuilder.release().withTaskId(task.getId()).build());
}
}
}
- 此时可以观看数据库表
act_ru_task
中的assignee字段已经为null, 那么此用户组中的其他用户在进行查询的时候,此任务可以被用户组中的其他用户查询到,这里就不测试了。
2.6 通过任务Id设置 全局/局部 流程变量
/**
* 通过taskId 设置流程变量
* 注意事项与 不与springboot整合时 是一样的
*/
@Test
public void testSetVar() {
//1. 模拟登陆,因为activiti7与springSecurity有强耦合
// 参数可以在DemoApplicationConfiguration.java 文件中获得。因为这里是测试。并没有实际结合springSecurity
securityUtil.logInAs("erdemedeiros");
String taskId = "78d0ee10-47f1-11ea-b90b-005056c00008";
Map<String, Object> varMap = new HashMap<>();
varMap.put("name", "immort");
varMap.put("age", 18);
// 如果设置局部变量则:加上.localOnly()即可
taskRuntime.setVariables(TaskPayloadBuilder.setVariables().withTaskId(taskId).withVariables(varMap).build());
}
- 数据库表中可以看到已经设置了。
2.7 通过任务id获取流程变量
/**
* 测试获取流程变量
* 注意事项与 不与springBoot整合时时一样的
*/
@Test
public void testGetVar() {
//1. 模拟登陆,因为activiti7与springSecurity有强耦合
// 参数可以在DemoApplicationConfiguration.java 文件中获得。因为这里是测试。并没有实际结合springSecurity
securityUtil.logInAs("erdemedeiros");
String taskId = "78d0ee10-47f1-11ea-b90b-005056c00008";
//如果想获取局部变量 后面加.localOnly()即可
List<VariableInstance> variables = taskRuntime.variables(TaskPayloadBuilder.variables().withTaskId(taskId).build());
for (VariableInstance variable : variables) {
System.out.println(variable.getName() + " : " + variable.getValue());
}
}
2.8 完成任务
/**
*测试完成任务
*/
@Test
public void testCompleteTask() {
//1. 模拟登陆,因为activiti7与springSecurity有强耦合
// 参数可以在DemoApplicationConfiguration.java 文件中获得。因为这里是测试。并没有实际结合springSecurity
securityUtil.logInAs("erdemedeiros");
Page<Task> tasks = taskRuntime.tasks(Pageable.of(0, 10));
List<Task> tasksContent = tasks.getContent();
for (Task task : tasksContent) {
// 打印任务基本信息
System.out.println(task.getName());
System.out.println(task.getAssignee());
//拾取任务。
taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build());
System.out.println("拾取成功!");
//完成任务
taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId()).build());
System.out.println("完成任务!");
}
}
3. 总结
上面只是我看文档得到的一些基本操作。因为暂时activiti7的中文文档比较少。所以还是只能去看英文的。如有不对的地方请指出。共同学习,谢谢。