最簡單的Activiti入門教程

這篇文章主要講以下三個方面

  • 工作流介紹
  • 工作流執行過程
  • 工作流模擬執行

工作流介紹

以我們公司的報銷流程爲例:
小明--->提交申請--->人事審批-->經理審批-->財務審批--->結束
我們先思考一下,需要實現這的一個需求我們需要怎麼做?
    我們可能需要去維護一個變量,來不斷傳遞過去下一個處理者,或者是建相關的任務表之類的,如果需求不會變,沒有什麼條件處理,這樣也好設計。
    但是,如果有條件【不同職位員工審批方式不一樣】,需求更改了【不需要人事審批了】,那麼我們的代碼就會亂,不好維護。
    再來看這種問題就是一種流式的控制管理,基於這麼一個原因,我們需要學習一個框架來幫我們完成並管理這樣的報銷流程,他可以在上級點擊同意後自動將提交記錄錄到電腦並流轉到下一節點,這就是我們這裏要講的工作流技術。

工作流(Workflow),就是“業務過程的部分或整體在計算機應用環境下的自動化”,它主要解決的是“使在多個參與者之間按照某種預定義的規則傳遞文檔、信息或任務的過程自動進行,從而實現某個預期的業務目標,或者促使此目標的實現”

這裏我們也可以比對出工作流的優點:
  1. 提高系統的柔性,適應業務流程的變化
  2. 實現更好的業務過程控制,提高顧客服務質量
  3. 降低系統開發和維護成本

工作流執行過程

我們以官網提供的示例包演示:
官網https://www.activiti.org/get-started下載對應的jar包,解壓出來,在wars包目錄下有個activiti-app.war,把這個包放到tomgcat運行(運行之前我把數據庫配置改成我本地的mysql:WEB-INF\classes\META-INF\activiti-app\activiti-app.properties

項目啓動成功進入到首頁

1.png

  • Kickstart App:主要用於流程模型管理、表單管理及應用(App)管理,一個應用可以包含多個流程模型,應用可發佈給其他用戶使用。
  • Task App:用於管理整個activiti-app的任務,在該功能裏面也可以啓動流程
  • Idenity management:身份信息管理,可以管理用戶、用戶組等數據

進入第三個菜單Identity management
新建用戶:這邊新建用戶小明假設他爲員工,王五是經理

2.png

3.png

定義流程

在主界面點擊Kickstart App,點擊create Process按鈕彈出新建流程模型界面


4.png

5.png

6.png

上圖中定義了一個開始事件、兩個用戶任務、一個結束事件。我們定義的請假業務,需要將該用戶任務分配給 小明。點擊第一個用戶任務,並修改“Assignment”屬性,將“提交申請”任務分配給“xiaoming”用戶。保存成功後,再使用同樣的方法將“部門經理審批”任務分配給 王五用戶,保存流程模型後,就可以將流程發佈。


7.png

發佈流程

在 activiti-app 中,一個 App 可包含多個流程模型,因此在發佈流程前,先新建一個 App併爲其設置流程模型。點擊 Apps 菜單,再點擊“Creaea App”按鈕,新建一個 App,該App就包含我們前面所設計的請假流程模型

8.png

建好之後需要爲其設置流程模型
9.png

點擊一下即可,在關閉
q.png

點擊進入到app中,點擊發布public進行發佈
w.png

發佈成功後使用小明賬戶登錄,進入到首頁可以看到
e.png

進入請假流程模型App並且點擊“Processes”菜單,在界面左上角,可以看到“Start a process”按鈕,點擊啓動請假流程後,可以看到界面如圖所示
r.png

點擊complete,完成,任務跳轉到下一個執行人
t.png

直至整個流程審批完成,結束
y.png

工作流模擬執行

在我們模擬工作流流程之前在介紹下工作流引擎

ProcessEngine對象,這是Activiti工作的核心。負責生成流程運行時的各種實例及數據、監控和管理流程的運行,其主要有以下兩個職責

  • 定義流程,也就是給我們提供某種規範來定義規則,以及如何定義一個流程的這種規範,同事我們可以根據工作流引擎提供的相關概念來定義更爲複雜的流程,這就是工作流引擎做的第一件事叫做定義流程。
  • 執行流程,也就是工作流引擎需要解釋這個規則,還要負責流程,它相當於流程的調度者,監控每個流程的執行情況,並將流程操作發往下一步,或者根據條件休眠或終止流程的這麼一個過程就叫做執行流程。

    瞭解完工作流引擎的這兩個職責,我相信對於什麼是工作流引擎一定已經有了一定的認識了,我們在用一句稍微有點官方的話來總結一下工作流引擎:工作流引擎爲我們提供相關規則概念的定義,給我們提供了相關的API來調用這個引擎去執行流程。流程的操作實際上就是工作流引擎提供相關的api我們去調用它。

activiti.cfg.xml(activiti的配置文件)

Activiti核心配置文件,配置流程引擎創建工具的基本參數和數據庫連接池參數
定義數據庫配置參數

  • jdbcUrl: 數據庫的JDBC URL。
  • jdbcDriver: 對應不同數據庫類型的驅動。
  • jdbcUsername: 連接數據庫的用戶名。
  • jdbcPassword: 連接數據庫的密碼。

基於JDBC參數配置的數據庫連接 會使用默認的MyBatis連接池。 下面的參數可以用來配置連接池(來自MyBatis參數)

  • jdbcMaxActiveConnections: 連接池中處於被使用狀態的連接的最大值。默認爲10。
  • jdbcMaxIdleConnections: 連接池中處於空閒狀態的連接的最大值。
  • jdbcMaxCheckoutTime: 連接被取出使用的最長時間,超過時間會被強制回收。 默認爲20000(20秒)。
  • jdbcMaxWaitTime: 這是一個底層配置,讓連接池可以在長時間無法獲得連接時, 打印一條日誌,並重新嘗試獲取一個連接。(避免因爲錯誤配置導致沉默的操作失敗)。 默認爲20000(20秒)

下面所有的操作都需要用到工作流引擎對象,我們可以如下方式獲取:

    ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();

這裏默認會去資源路徑下讀取配置文件activiti.cfg.xml

我們再來回顧下工作流執行過程,首先需要畫好流程圖,然後部署到app上
這個步驟我們叫:部署流程定義

 public void deploymentProcessDefinition(){
        Deployment deploy = processEngine.getRepositoryService()  //與流程定義和部署對象相關的Service
                .createDeployment()  //創建一個部署對象
                .name("審批流程")     //添加部署名稱
                .addClasspathResource("diagrams/audit.xml")  //從classPath資源中加載,一次只能加載一個文件
                .addClasspathResource("diagrams/audit.png")
                .deploy();  //完成部署
    }

說明:

  • 首先獲得默認的流程引擎,通過流程引擎獲取了一個RepositoryService對象(倉庫對象)
  • 由倉庫的服務對象產生一個部署對象配置對象,用來封裝部署操作的相關配置。
  • 這是一個鏈式編程,在部署配置對象中設置顯示名,上傳流程定義規則文件
  • 向數據庫表中存放流程定義的規則信息。
這一步在數據庫中將操作三張表
  • act_re_deployment(部署對象表)
    存放流程定義的顯示名和部署時間,每部署一次增加一條記錄
  • act_re_procdef(流程定義表)
    存放流程定義的屬性信息,部署每個新的流程定義都會在這張表中增加一條記錄。
    注意:當流程定義的key相同的情況下,使用的是版本升級
  • act_ge_bytearray(資源文件表)
    存儲流程定義相關的部署信息。即流程定義文檔的存放地。每部署一次就會增加兩條記錄,一條是關於bpmn規則文件的,一條是圖片的(如果部署時只指定了bpmn一個文件,activiti會在部署時解析bpmn文件內容自動生成流程圖)。兩個文件不是很大,都是以二進制形式存儲在數據庫中
然後需要發佈:啓動流程
    public void startProcess(){
        ProcessInstance process = processEngine.getRuntimeService().startProcessInstanceByKey("myProcess_1");
    }

操作數據庫的act_ru_execution表,如果是用戶任務節點,同時也會在act_ru_task添加一條記錄,我們可以看到小明會有一條任務,查詢操作如下:

        List<Task> taskList = processEngine.getTaskService()//與正在執行的任務管理相關的Service
                .createTaskQuery()//創建任務查詢對象
                /**查詢條件(where部分)*/
                .taskAssignee("小明")//指定個人任務查詢,指定辦理人
//                      .taskCandidateUser(candidateUser)//組任務的辦理人查詢
//                      .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
//                      .processInstanceId(processInstanceId)//使用流程實例ID查詢
//                      .executionId(executionId)//使用執行對象ID查詢
                /**排序*/
                .orderByTaskCreateTime().asc()//使用創建時間的升序排列
                /**返回結果集*/
//                      .singleResult()//返回惟一結果集
//                      .count()//返回結果集的數量
//                      .listPage(firstResult, maxResults);//分頁查詢
                .list();//返回列表
        for (Task task:taskList){
            System.out.println("任務ID:"+task.getId());
            System.out.println("任務名稱:"+task.getName());
            System.out.println("任務的創建時間:"+task.getCreateTime());
            System.out.println("任務的辦理人:"+task.getAssignee());
            System.out.println("流程實例ID:"+task.getProcessInstanceId());
            System.out.println("執行對象ID:"+task.getExecutionId());
            System.out.println("流程定義ID:"+task.getProcessDefinitionId());
        }

說明

  • 因爲是任務查詢,所以從processEngine中應該得到TaskService
  • 使用TaskService獲取到任務查詢對象TaskQuery
  • 爲查詢對象添加查詢過濾條件,使用taskAssignee指定任務的辦理者(即查詢指定用戶的代辦任務),同時可以添加分頁排序等過濾條件
  • 調用list方法執行查詢,返回辦理者爲指定用戶的任務列表
  • 任務ID、名稱、辦理人、創建時間可以從act_ru_task表中查到。
  • 一個Task節點和Execution節點是1對1的情況,在task對象中使用Execution_來表示他們之間的關係
  • 任務ID在數據庫表act_ru_task中對應“ID_”列
完成任務
    public void completeMyPersonalTask(){
        processEngine.getTaskService().  //正在執行任務相關的Service
                complete("104");  //根據taskid完成任務
    }

說明

  • 是辦理任務,所以從ProcessEngine得到的是TaskService。
  • 當執行完這段代碼,再以員工的身份去執行查詢的時候,會發現這個時候已經沒有數據了,因爲正在執行的任務中沒有數據。
  • 對於執行完的任務,activiti將從act_ru_task表中刪除該任務,下一個任務會被插入進來。
  • 以”部門經理”的身份進行查詢,可以查到結果。因爲流程執行到部門經理審批這個節點了。
  • 再執行辦理任務代碼,執行完以後以”部門經理”身份進行查詢,沒有結果。
  • 重複第4和5步直到流程執行完。
綜上,我們可以總結出這個幾個Service
  • RepositoryService
    是Activiti的倉庫服務類。所謂的倉庫指流程定義文檔的兩個文件:bpmn文件和流程圖片。
  • RuntimeService
    是activiti的流程執行服務類。可以從這個服務類中獲取很多關於流程執行相關的信息。
  • TaskService
    是activiti的任務服務類。可以從這個類中獲取任務的信息。
  • HistoryService
    是activiti的查詢歷史信息的類。在一個流程執行完成後,這個對象爲我們提供查詢歷史信息。
亦可以總結所用到的表
  • ACT_RE_*: 'RE'表示repository。 這個前綴的表包含了流程定義和流程靜態資源 (圖片,規則,等等)。
  • ACT_RU_*: 'RU'表示runtime。 這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。 Activiti只在流程實例執行過程中保存這些數據, 在流程結束時就會刪除這些記錄。 這樣運行時表可以一直很小速度很快。
  • ACT_ID_*: 'ID'表示identity。 這些表包含身份信息,比如用戶,組等等。
  • ACT_HI_*: 'HI'表示history。 這些表包含歷史數據,比如歷史流程實例, 變量,任務等等。
  • ACT_GE_*: 通用數據, 用於不同場景下,如存放資源文件。

資源庫流程規則表

  1. act_re_deployment 部署信息表
  2. act_re_model 流程設計模型部署表
  3. act_re_procdef 流程定義數據表
    運行時數據庫表
  4. act_ru_execution 運行時流程執行實例表
  5. act_ru_identitylink 運行時流程人員表,主要存儲任務節點與參與者的相關信息
  6. act_ru_task 運行時任務節點表
  7. act_ru_variable 運行時流程變量數據表
  8. act_ru_job 工作數據表
  9. act_ru_event_subscr 事件描述表
    歷史數據庫表
  10. act_hi_actinst 歷史節點表
  11. act_hi_attachment 歷史附件表
  12. act_hi_comment 歷史意見表
  13. act_hi_identitylink 歷史流程人員表
  14. act_hi_detail 歷史詳情表,提供歷史變量的查詢
  15. act_hi_procinst 歷史流程實例表
  16. act_hi_taskinst 歷史任務實例表
  17. act_hi_varinst 歷史變量表
    組織機構表
  18. act_id_group 用戶組信息表
  19. act_id_info 用戶擴展信息表
  20. act_id_membership 用戶與用戶組對應信息表
  21. act_id_user 用戶信息表
    通用數據表
  22. act_ge_bytearray 二進制數據表
  23. act_ge_property 屬性數據表存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄,


    27102725_uKzQ.jpg

企業中的應用

未完

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章