Activiti6工作流入门初体验
簡介:
工作流是開發(fā)者邁向更高級的一個階梯,能夠幫助我們在更規(guī)范清晰的業(yè)務(wù)場景下更加高效的實現(xiàn)開發(fā)工作。
適用場景:
任何一個中間件的引入都會帶來額外的復(fù)雜度,如果不能正確的認識和使用她,那么她就是累贅。工作流是一個很龐大的中間層,一般用于企業(yè)中臺的流程管理,保證流程的清晰規(guī)范高效的同時,大大減少了開發(fā)的工作量。
當我們需要開發(fā)一個多角色參與的業(yè)務(wù)流程時,我們們就需要工作流,如請假審批流程、會議室申請、物資采購流程、網(wǎng)購從下單到物流跟蹤簽收整個后臺流程等
工作流技術(shù)現(xiàn)狀:
工作流最初都是基于jboss的jbpm,代表性的是activiti和flowable。activiti開發(fā)團隊解散重組后,部分activiti核心開發(fā)人員開啟了flowable項目,原開發(fā)人員則推進activiti7版本的開發(fā)。
網(wǎng)上能找到的工作流學習資料比較少,目前activiti7分別在5月和6月推出了7.1.0M1和M2版本,flowable也到了6.4.1版本,但事實上這兩個目前都是還在開發(fā)中的半成品。如果想要使用的話,還是尋求穩(wěn)定版本較好,activiti的穩(wěn)定版本有5.22和6.0.0,我在這里以6.0.0版本為例介紹下我的學習過程。
?
知識基礎(chǔ):
activiti是以BPMN規(guī)范為基礎(chǔ)的,所以需要了解BPMN的基礎(chǔ)知識,這里只作簡單介紹。
bpmn通過流程圖和用戶交互,用工作流自己的表來維護流程數(shù)據(jù),其中activiti是28張表,以act_開頭,act_hi_是歷史記錄類表、act_ru_是運行時流程數(shù)據(jù)維護表。
BPMN基本對象:
事件event: 代表開始和結(jié)束,流程圖表示為圓
活動Task(activity):代表處理活動的角色,流程圖是一個矩形
網(wǎng)關(guān)gateway:代表角色的處理選擇,決定流程走向,流程圖是一個菱形
流向flow:代表流程圖走向,流程圖是一個單方向的箭頭線
活動任務(wù) Task:
userTask 人機交互任務(wù),必須有人參與操作的任務(wù)
ServiceTask Task服務(wù)任務(wù),機器自動化
SendTask 發(fā)送任務(wù),類似于ServiceTask
ReceiveTask 狀態(tài)任務(wù),一般用戶表示活動狀態(tài),需要singal進行流轉(zhuǎn)
ManualTask 線下手工執(zhí)行任務(wù)
BusinessRuleTask 業(yè)務(wù)規(guī)則任務(wù)
ScriptTask 腳本任務(wù)
AbstractTask 抽象任務(wù)
網(wǎng)關(guān) Gateways:
parallel Gateway?并行網(wǎng)關(guān) 菱形中一個加號,不會解析條件
Exclusive Gateway 排他網(wǎng)關(guān) 菱形或者菱形中一個乘號
Inclusive Gateway 包容網(wǎng)關(guān) 菱形中一個圓,走完所有符合條件的flow
?
工作準備:
安裝eclipse并安裝activiti流程圖繪制插件
打開Eclipse -> Help -> Install New SoftWare-> Add
name任意 location:http://www.activiti.org/designer/update/
如果網(wǎng)絡(luò)不好請架梯子翻墻并反復(fù)嘗試,網(wǎng)上離線安裝的方法我試過了,不可用。
idea玩家可以setting-plugin-actiBPM install下載安裝
不過學習階段不推薦使用idea插件,本人一開始就用的actiBPM,結(jié)果畫出來的的流程圖部署時總是報錯,而且actiBPM的表單支持非常糟糕
還有其他的繪圖工具如bpmn-js,還在開發(fā)中,功能并不完善不推薦
學習開始:
1.流程圖工程新建
新建activiti項目:eclipse-文件-新建-其他-activiti-activitiProject
新建activiti空白文件:eclipse-文件-新建-其他-activiti-activitiDiagram
2.使用右側(cè)的畫板,畫一個簡單的審批流程圖如圖
3.填充流程圖信息[重點]
流程圖里可以填充的信息選擇非常多,每一條信息,在代碼中都是有用的,在嘗試成功部署運行流程圖后,慢慢去理解他每一個配置的意義。此處只展示實現(xiàn)該簡單流程需要的配置
3.1文件命名
鼠標點擊空白處,填充如下信息,用來命名該bpmn文件的名稱和id
3.2userTask審批填充
鼠標點擊領(lǐng)導審批矩形框,填充領(lǐng)導審批業(yè)務(wù)的名稱和id
選擇屬性下的Form-NEW,填寫領(lǐng)導審批需要的表單信息,其中type為string,全小寫。完成后如圖所示
人事審批和重新申請以此類推。
3.3網(wǎng)關(guān)flow條件填充
點擊領(lǐng)導審批后面的網(wǎng)關(guān)指向人事的線,在屬性的Main config里填寫審批判斷條件,此處的tlApprove和之前領(lǐng)導審批Form中的單詞大小寫要一致
點擊該網(wǎng)關(guān)指向重新申請的線作同樣的修改,其他類推,如圖。
填充完畢保存。至此,一個簡易的流程就畫完了總結(jié)下,其實我們必須要填的就兩個地方:1.form中xxApprove用于存儲用戶傳給系統(tǒng)的指令(同意/反對)2.網(wǎng)關(guān)后面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文件復(fù)制進來
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("流程啟動");//創(chuàng)建流程引擎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());//處理流程任務(wù)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("待處理任務(wù):{}",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("您輸入的內(nèi)容是:{}",line);}taskService.complete(task.getId(),variables);//查詢當前流程實例processInstance = processEngine.getRuntimeService().createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();}logger.info("待處理任務(wù)數(shù)量:{}",list.size());}} }5.執(zhí)行流程
執(zhí)行結(jié)果如下圖,本次工作流入門體驗完畢,下一節(jié)將進一步講解在工作中如何實際使用activiti完成開發(fā)任務(wù)
?
本文代碼Github地址
總結(jié)
以上是生活随笔為你收集整理的Activiti6工作流入门初体验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 投资效率模型两个版本(含stata代码以
- 下一篇: 开发者 发展 9 心智模式