Activiti6工作流入门初体验
簡介:
工作流是開發者邁向更高級的一個階梯,能夠幫助我們在更規范清晰的業務場景下更加高效的實現開發工作。
適用場景:
任何一個中間件的引入都會帶來額外的復雜度,如果不能正確的認識和使用她,那么她就是累贅。工作流是一個很龐大的中間層,一般用于企業中臺的流程管理,保證流程的清晰規范高效的同時,大大減少了開發的工作量。
當我們需要開發一個多角色參與的業務流程時,我們們就需要工作流,如請假審批流程、會議室申請、物資采購流程、網購從下單到物流跟蹤簽收整個后臺流程等
工作流技術現狀:
工作流最初都是基于jboss的jbpm,代表性的是activiti和flowable。activiti開發團隊解散重組后,部分activiti核心開發人員開啟了flowable項目,原開發人員則推進activiti7版本的開發。
網上能找到的工作流學習資料比較少,目前activiti7分別在5月和6月推出了7.1.0M1和M2版本,flowable也到了6.4.1版本,但事實上這兩個目前都是還在開發中的半成品。如果想要使用的話,還是尋求穩定版本較好,activiti的穩定版本有5.22和6.0.0,我在這里以6.0.0版本為例介紹下我的學習過程。
?
知識基礎:
activiti是以BPMN規范為基礎的,所以需要了解BPMN的基礎知識,這里只作簡單介紹。
bpmn通過流程圖和用戶交互,用工作流自己的表來維護流程數據,其中activiti是28張表,以act_開頭,act_hi_是歷史記錄類表、act_ru_是運行時流程數據維護表。
BPMN基本對象:
事件event: 代表開始和結束,流程圖表示為圓
活動Task(activity):代表處理活動的角色,流程圖是一個矩形
網關gateway:代表角色的處理選擇,決定流程走向,流程圖是一個菱形
流向flow:代表流程圖走向,流程圖是一個單方向的箭頭線
活動任務 Task:
userTask 人機交互任務,必須有人參與操作的任務
ServiceTask Task服務任務,機器自動化
SendTask 發送任務,類似于ServiceTask
ReceiveTask 狀態任務,一般用戶表示活動狀態,需要singal進行流轉
ManualTask 線下手工執行任務
BusinessRuleTask 業務規則任務
ScriptTask 腳本任務
AbstractTask 抽象任務
網關 Gateways:
parallel Gateway?并行網關 菱形中一個加號,不會解析條件
Exclusive Gateway 排他網關 菱形或者菱形中一個乘號
Inclusive Gateway 包容網關 菱形中一個圓,走完所有符合條件的flow
?
工作準備:
安裝eclipse并安裝activiti流程圖繪制插件
打開Eclipse -> Help -> Install New SoftWare-> Add
name任意 location:http://www.activiti.org/designer/update/
如果網絡不好請架梯子翻墻并反復嘗試,網上離線安裝的方法我試過了,不可用。
idea玩家可以setting-plugin-actiBPM install下載安裝
不過學習階段不推薦使用idea插件,本人一開始就用的actiBPM,結果畫出來的的流程圖部署時總是報錯,而且actiBPM的表單支持非常糟糕
還有其他的繪圖工具如bpmn-js,還在開發中,功能并不完善不推薦
學習開始:
1.流程圖工程新建
新建activiti項目:eclipse-文件-新建-其他-activiti-activitiProject
新建activiti空白文件:eclipse-文件-新建-其他-activiti-activitiDiagram
2.使用右側的畫板,畫一個簡單的審批流程圖如圖
3.填充流程圖信息[重點]
流程圖里可以填充的信息選擇非常多,每一條信息,在代碼中都是有用的,在嘗試成功部署運行流程圖后,慢慢去理解他每一個配置的意義。此處只展示實現該簡單流程需要的配置
3.1文件命名
鼠標點擊空白處,填充如下信息,用來命名該bpmn文件的名稱和id
3.2userTask審批填充
鼠標點擊領導審批矩形框,填充領導審批業務的名稱和id
選擇屬性下的Form-NEW,填寫領導審批需要的表單信息,其中type為string,全小寫。完成后如圖所示
人事審批和重新申請以此類推。
3.3網關flow條件填充
點擊領導審批后面的網關指向人事的線,在屬性的Main config里填寫審批判斷條件,此處的tlApprove和之前領導審批Form中的單詞大小寫要一致
點擊該網關指向重新申請的線作同樣的修改,其他類推,如圖。
填充完畢保存。至此,一個簡易的流程就畫完了總結下,其實我們必須要填的就兩個地方:1.form中xxApprove用于存儲用戶傳給系統的指令(同意/反對)2.網關后面flow的判斷條件,寫法和jsp一樣${xxApprove == flag}
4.搭建一個java工程,部署并運行該流程圖
4.1使用idea新建一個普通工程
file-new-project-spring initializr-next...finish;可以把demo改成自己喜歡的名字,如activiti6
4.2添加activiti依賴
在pom文件中添加activiti依賴和h2database依賴
<dependency><groupId>org.activiti</groupId><artifactId>activiti-engine</artifactId><version>6.0.0</version> </dependency> <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>1.3.176</version> </dependency>4.3添加bpmn文件
在resource目錄下新建一個processes目錄,將剛剛eclipse中畫好的bpmn文件復制進來
4.4添加日志配置文件
在resource目錄下新建一個名為logback.xml的文件,輸入如下xml配置
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"><property name="log.dir" scan="true" scanPeriod="30 seconds"/><property name="encoding" value="UTF-8"/><property name="plain" value="%msg%n"/><property name="std" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/><!-- 控制臺輸出 --><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${plain}</pattern><charset>${encoding}</charset></encoder></appender><!-- 日志輸出級別 --><logger name="root"><level value="ERROR"/></logger><logger name="com.example"><level value="DEBUG"/></logger><root><appender-ref ref="stdout" /></root> </configuration>?
4.5新建一個測試類用來部署并運行我們的bpmn文件
package com.example.activiti6.generate;import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.RepositoryService; import org.activiti.engine.TaskService; import org.activiti.engine.form.FormProperty; import org.activiti.engine.impl.form.StringFormType; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner;/*** @ClassName demotest* @Description TODO* @Author cheng* @Date 2019/6/23 13:53**/ public class demotest {private static final Logger logger = LoggerFactory.getLogger(demotest.class);public static void main(String[] args) {logger.info("流程啟動");//創建流程引擎ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration().buildProcessEngine();logger.info("流程器名稱:{};流程器版本號:{}",processEngine.getName(),ProcessEngine.VERSION);//部署流程定義文件RepositoryService repositoryService = processEngine.getRepositoryService();Deployment deploy = repositoryService.createDeployment().addClasspathResource("processes/MyProcess.bpmn").deploy();ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();logger.info("流程定義文件名稱:{};流程定義文件id:{}",processDefinition.getName(),processDefinition.getId());//啟動運行流程ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceById(processDefinition.getId());logger.info("流程實例的定義key:{}",processInstance.getProcessDefinitionKey());//處理流程任務Scanner scanner = new Scanner(System.in);while(processInstance != null && !processInstance.isEnded()){TaskService taskService = processEngine.getTaskService();List<Task> list = taskService.createTaskQuery().list();for (Task task : list) {logger.info("待處理任務:{}",task.getName());List<FormProperty> formProperties = processEngine.getFormService().getTaskFormData(task.getId()).getFormProperties();Map<String,Object> variables = new HashMap<>();for (FormProperty formProperty : formProperties) {String line = null;if(StringFormType.class.isInstance(formProperty.getType())){logger.info("請輸入:{}",formProperty.getName());line = scanner.nextLine();variables.put(formProperty.getId(),line);}else{logger.info("您輸入的類型不支持:{}",formProperty.getType());}logger.info("您輸入的內容是:{}",line);}taskService.complete(task.getId(),variables);//查詢當前流程實例processInstance = processEngine.getRuntimeService().createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();}logger.info("待處理任務數量:{}",list.size());}} }5.執行流程
執行結果如下圖,本次工作流入門體驗完畢,下一節將進一步講解在工作中如何實際使用activiti完成開發任務
?
本文代碼Github地址
總結
以上是生活随笔為你收集整理的Activiti6工作流入门初体验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 投资效率模型两个版本(含stata代码以
- 下一篇: 前端Vue框架搭建