1. 程式人生 > 其它 >activiti學習筆記

activiti學習筆記

技術標籤:工作流activiti

文章目錄

前言

專案中要使用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&amp;useUnicode=true&amp;characterEncoding=UTF8&amp;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可很好的理解。