Integrating Activiti7 with SpringBoot: Dependencies, Deployment, Usage, and Advanced Operations
This article provides a comprehensive guide on using Activiti7 in a SpringBoot project, covering Maven dependencies, IDE configuration, process deployment, task handling, business keys, process suspension/activation, candidate users, gateways, and includes complete Java code examples for each step.
1. Dependencies
Add the Activiti SpringBoot starter and image generator dependencies to your pom.xml , excluding conflicting MyBatis and commons libraries.
<!-- Add Activiti and SpringBoot integration dependencies -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.0.0.SR1</version>
<exclusions>
<exclusion>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</exclusion>
<exclusion>
<groupId>commons-lang3</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Activiti image generator dependency -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-image-generator</artifactId>
<version>7.0.0.SR1</version>
<exclusions>
<exclusion>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</exclusion>
</exclusions>
</dependency>2. Install Activiti Environment
Configure IDEA to use UTF‑8 encoding and install the Activiti diagram plugin to avoid Chinese garbled characters.
File → Settings → Editor → File Encodings → set to UTF‑8.
Help → Edit Custom VM Options → add -Dfile.encoding=UTF-8 .
Modify idea.exe.vmoptions and idea64.exe.vmoptions similarly, then restart IDEA.
3. Start Using
3.1 Create a BPMN file
Design a basic leave request process using the Activiti BPMN editor.
3.2 Deploy Process Definition
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.junit.Test;
@Test
public void testDeploy() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/leave.bpmn")
.name("请假流程")
.deploy();
System.out.println("流程部署ID:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
}3.3 Start Process Instance
@Test
public void testStartProcess() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance instance = runtimeService.startProcessInstanceByKey("leaveProcess");
System.out.println("流程定义的id = " + instance.getProcessDefinitionId());
System.out.println("流程实例的id = " + instance.getId());
}3.4 Query and Complete Tasks
@Test
public void testSelectTodoTaskList() {
String assignee = "李四";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List
taskList = taskService.createTaskQuery()
.processDefinitionKey("leaveProcess")
.taskAssignee(assignee)
.list();
for (Task task : taskList) {
System.out.println("流程定义id = " + task.getProcessDefinitionId());
System.out.println("流程实例id = " + task.getProcessInstanceId());
System.out.println("任务id = " + task.getId());
System.out.println("任务名称 = " + task.getName());
}
}
@Test
public void testCompleteTask() {
String assignee = "李四";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List
taskList = taskService.createTaskQuery()
.processDefinitionKey("leaveProcess")
.taskAssignee(assignee)
.list();
for (Task task : taskList) {
taskService.complete(task.getId());
}
}4. Advanced Operations
4.1 BusinessKey Usage
When starting a process, pass a business key to link the workflow instance with a business record.
@Test
public void testStartProcessWithBusinessKey() {
String businessKey = "8001";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance instance = runtimeService.startProcessInstanceByKey("leaveProcess", businessKey);
System.out.println("业务key:" + instance.getBusinessKey());
}4.2 Suspend/Activate Process Definitions and Instances
@Test
public void testSuspendAllProcessInstance() {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repo = engine.getRepositoryService();
ProcessDefinition def = repo.createProcessDefinitionQuery()
.processDefinitionKey("leaveProcess")
.singleResult();
boolean suspended = def.isSuspended();
if (suspended) {
repo.activateProcessDefinitionById(def.getId(), true, null);
} else {
repo.suspendProcessDefinitionById(def.getId(), true, null);
}
}
@Test
public void testSuspendSingleProcessInstance() {
String processInstanceId = "2501";
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtime = engine.getRuntimeService();
ProcessInstance instance = runtime.createProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
if (instance.isSuspended()) {
runtime.activateProcessInstanceById(processInstanceId);
} else {
runtime.suspendProcessInstanceById(processInstanceId);
}
}4.3 Candidate Users and Task Claiming
Define multiple candidate users in the BPMN file and let a user claim a task before completing it.
@Test
public void testClaimTask() {
String taskId = "2505";
String assignee = "张三";
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
taskService.claim(taskId, assignee);
}
@Test
public void testCompleteClaimedTask() {
String taskId = "2505";
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
taskService.complete(taskId);
}4.4 Gateways
Examples of exclusive, parallel, and inclusive gateways are provided to illustrate decision logic based on process variables such as day .
@Test
public void testExclusiveGateway() {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtime = engine.getRuntimeService();
Map
vars = new HashMap<>();
vars.put("day", 0);
ProcessInstance instance = runtime.startProcessInstanceByKey("leaveEGatewayProcess", vars);
System.out.println("流程实例ID=" + instance.getId());
}5. Service Overview
The main Activiti services used are:
RepositoryService : Deploy and manage process definitions.
RuntimeService : Start processes and query runtime data.
TaskService : Query, claim, complete, and add comments to tasks.
HistoryService : Retrieve historic execution information.
ManagementService : Engine administration and maintenance.
Typical operations include deployment, starting a process, querying tasks, completing tasks, claiming tasks, adding comments, suspending/activating definitions or instances, downloading resources, and deleting deployments.
Top Architect
Top Architect focuses on sharing practical architecture knowledge, covering enterprise, system, website, large‑scale distributed, and high‑availability architectures, plus architecture adjustments using internet technologies. We welcome idea‑driven, sharing‑oriented architects to exchange and learn together.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.