一、爲什麼選擇Activiti(本人已經轉爲使用eclipse,idea的bpmn工具不好用)
二、核心7大接口、28張表
7大接口(service)
- RepositoryService:提供一系列管理流程部署和流程定義的API。
- RuntimeService:在流程運行時對流程實例進行管理與控制。
- TaskService:對流程任務進行管理,例如任務提醒、任務完成和創建任務等。
- IdentityService:提供對流程角色數據進行管理的API,這些角色數據包括用戶組、用戶及它們之間的關係。
- ManagementService:提供對流程引擎進行管理和維護的服務。
- HistoryService:對流程的歷史數據進行操作,包括查詢、刪除這些歷史數據。
- FormService:表單服務。
(二)28張表
- act_ge_ 通用數據表,ge是general的縮寫
- act_hi_ 歷史數據表,hi是history的縮寫,對應HistoryService接口
- act_id_ 身份數據表,id是identity的縮寫,對應IdentityService接口
- act_re_ 流程存儲表,re是repository的縮寫,對應RepositoryService接口,存儲流程部署和流程定義等靜態數據
- act_ru_ 運行時數據表,ru是runtime的縮寫,對應RuntimeService接口和TaskService接口,存儲流程實例和用戶任務等動態數據
三、Spring Boot2.0與Activiti 6.0整合
-
在POM文件中添加依賴
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>6.0.0</version> </dependency>
-
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)//排除類
-
創建cs.bpmn文件到項目文件夾/resources/processes下,設置流程:
-
修改cs.bpmn爲xml,點擊選中cs.xml文件(亂碼的話自行解決)右鍵,如下圖:
-
application.yml文件添加配置項
spring: activiti: check-process-definitions: false
-
啓動應用,會在數據庫裏創建28張表
-
完成以上步驟,就可以在程序中使用自動注入的方式,使用Activiti的7大接口。
@Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Autowired private IdentityService identityService; @Autowired private RepositoryService repositoryService; @Autowired private ProcessEngine processEngine; @Autowired private HistoryService historyService;
-
部署工作流(流程定義和部署對象相關的service)
@Test public void dybs() { Deployment deployment = repositoryService//流程定義和部署對象相關的service .createDeployment()//創建一個部署對象 .name("helloWorld")//創建一個部署對象 .addClasspathResource("processes/qjsp.bpmn")// 加載文件 .addClasspathResource("processes/qjsp.png")// 加載文件 .deploy();//完成部署 System.out.println("部署id"+deployment.getId()); System.out.println("部署名稱"+deployment.getName()); }
-
啓動工作流
@Test public void qdlc() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("qjlc"); System.out.println("流程實例id:" + processInstance.getId()); System.out.println("流程定義id:" + processInstance.getProcessDefinitionId()); }
-
查詢當前人的任務
public void grrw() { String assignee = "李四"; List<Task> res = taskService.createTaskQuery().taskAssignee(assignee).list(); if (res.size() > 0 && res != null) { for (Task t : res) { System.out.println("任務id:" + t.getId()); System.out.println("任務名稱:" + t.getName()); System.out.println("任務的創建時間:" + t.getCreateTime()); System.out.println("任務的辦理人:" + t.getAssignee()); System.out.println("流程實例的id:" + t.getProcessInstanceId()); System.out.println("執行對象id:" + t.getExecutionId()); System.out.println("執行對象id:" + t.getProcessDefinitionId()); System.out.println("####################################"); } } }
-
完成任務
@Test public void wcrw() { String taskId = "7502"; taskService.complete(taskId); System.out.println("完成任務-任務id:"+taskId); }
第二種集成方式
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>6.0.0</version>
</dependency>
ActivitiConfig.java配置
package com.ljq.rxrs.config;
import java.io.IOException;
import javax.sql.DataSource;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
@Configuration
public class ActivitiConfig {
@Bean
public ProcessEngine processEngine(DataSourceTransactionManager transactionManager, DataSource dataSource) throws IOException {
SpringProcessEngineConfiguration configuration = new SpringProcessEngineConfiguration();
//自動部署已有的流程文件
Resource[] resources = new PathMatchingResourcePatternResolver().getResources(ResourceLoader.CLASSPATH_URL_PREFIX + "processes/*.bpmn");
configuration.setTransactionManager(transactionManager);
configuration.setDataSource(dataSource);
configuration.setDatabaseSchemaUpdate("true");
configuration.setDeploymentResources(resources);
configuration.setDbIdentityUsed(false);
return configuration.buildProcessEngine();
}
@Bean
public RepositoryService repositoryService(ProcessEngine processEngine) {
return processEngine.getRepositoryService();
}
@Bean
public RuntimeService runtimeService(ProcessEngine processEngine) {
return processEngine.getRuntimeService();
}
@Bean
public TaskService taskService(ProcessEngine processEngine) {
return processEngine.getTaskService();
}
@Bean
public HistoryService historyService(ProcessEngine processEngine) {
return processEngine.getHistoryService();
}
@Bean
public ManagementService managementService(ProcessEngine processEngine) {
return processEngine.getManagementService();
}
@Bean
public IdentityService identityService(ProcessEngine processEngine) {
return processEngine.getIdentityService();
}
}