日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Activiti6工作流入门初体验

發(fā)布時間:2023/12/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Activiti6工作流入门初体验 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡介:

工作流是開發(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。