activiti學習筆記
阿新 • • 發佈:2020-12-17
文章目錄
前言
專案中要使用activiti工作流引擎,雖說兩年前第一份工作接觸到了工作流的內容,然而在兩年後我還是對activiti這種技術望洋興嘆。也是為了彌補之前的遺憾,所以就對activiti進行了一些瞭解。
activiti學習
原理
activiti把流程相關的資料儲存到自定義的一些表中。activiti使用的大概步驟時:定義bpmn流程圖->部署流程圖->開啟流程->完成任務。開啟流程後,流程會自動推進,直到遇到阻塞,比如使用者任務UserTask,那麼這是一個待完成的任務,需要某個執行人去執行該任務,任務完成後,流程推進到下一個阻塞任務,直到結束。
概念
ProcessEngine這個類主要用來獲取服務,如RepositoryService/RuntimeService/TaskService等,關於流程的操作主要是在這些service上進行的。
activiti的表
ACT_RE:靜態資源,比如流程圖檔案,流程定義等
ACT_GE:通用資料
ACT_HI:執行的歷史資料,比如執行過的任務等
ACT_RU:執行時的表,比如流程例項、任務等
act_hi_taskinst --> 完成任務時,新增一條下一節點的記錄,同時當前節點的結束時間補全,下一節點的結束時間為空
act_ru_task --> 完成任務時,刪除當前流程節點的記錄,同時新增下一流程節點的記錄;
定義bpmn流程圖
本人使用的是idea,通過畫圖外掛actiBpm去畫流程圖,不表。
部署流程圖
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 預設會找到resources/activiti.cfg.xml配置檔案
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()
.addClasspathResource("測試.bpmn" )
.deploy();
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
<!--自己本地的資料庫-->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3308/activiti201211?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT" />
<property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="root" />
<property name="databaseSchemaUpdate" value="true" />
</bean>
</beans>
開啟流程
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 第一個引數傳遞流程定義的key,第二個引數是businessKey,這個隨便定義,按照業務來
processEngine.getRuntimeService().startProcessInstanceByKey("testKey", "leaveMeAlone");
完成任務
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
Task task = processEngine.getTaskService().createTaskQuery().processDefinitionKey("testKey").singleResult();
if (task != null) {
processEngine.getTaskService().setAssignee(task.getId(), "張伯倫"); // 設定處理人
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("day", 4); // 傳遞引數
processEngine.getTaskService().setVariables(task.getId(), map);
processEngine.getTaskService().complete(task.getId()); // 完成任務
}
總結
activiti概念比較多,寫一個小demo可很好的理解。