1. 什么是工作流
1.1 工作流介紹
工作流(Workflow),就是通過計(jì)算機(jī)對業(yè)務(wù)流程自動化執(zhí)行管理。它主要解決的是“使在多個(gè)參與者之間按照某種預(yù)定義的規(guī)則自動進(jìn)行傳遞文檔、信息或任務(wù)的過程,從而實(shí)現(xiàn)某個(gè)預(yù)期的業(yè)務(wù)目標(biāo),或者促使此目標(biāo)的實(shí)現(xiàn)”。
1.2 工作流系統(tǒng)
什么是工作流系統(tǒng)
具有工作流程功能的軟件系統(tǒng)。用于更好的管理業(yè)務(wù)流程。
適用行業(yè),各行各業(yè)
比如,消費(fèi)品行業(yè),制造業(yè),電信服務(wù)業(yè),銀證險(xiǎn)等金融服務(wù)業(yè),物流服務(wù)業(yè),物業(yè)服務(wù)業(yè),物業(yè)管理,大中型進(jìn)出口貿(mào)易公司,政府事業(yè)機(jī)構(gòu),研究院所及教育服務(wù)業(yè)等,特別是大的跨國企業(yè)和集團(tuán)公司。
具體場景,凡是涉及到業(yè)務(wù)流程的所有場景
關(guān)鍵業(yè)務(wù)流程:訂單、報(bào)價(jià)處理、合同審核、客戶電話處理、供應(yīng)鏈管理等
行政管理類:出差申請、加班申請、請假申請、用車申請、各種辦公用品申請、購買申請、日報(bào)周報(bào)等凡是原來手工流轉(zhuǎn)處理的行政表單。
人事管理類:員工培訓(xùn)安排、績效考評、職位變動處理、員工檔案信息管理等。
財(cái)務(wù)相關(guān)類:付款請求、應(yīng)收款處理、日常報(bào)銷處理、出差報(bào)銷、預(yù)算和計(jì)劃申請等。
客戶服務(wù)類:客戶信息管理、客戶投訴、請求處理、售后服務(wù)管理等。
1.3 工作流實(shí)現(xiàn)方式
目前常見的工作流程有兩種方式:
通過狀態(tài)字段實(shí)現(xiàn)流程控制。原始,適合簡單流程控制。
工作流引擎實(shí)現(xiàn)流程控制。適用場景更廣泛,擴(kuò)展性更好。
1.4 工作流實(shí)現(xiàn)原理
Activiti牛批之處在于,它在不改變代碼的前提下實(shí)現(xiàn)各種業(yè)務(wù)流程的管理,適用性,擴(kuò)展性很優(yōu)秀。
activiti通過創(chuàng)建流程實(shí)例引擎,可以實(shí)現(xiàn)不同流程的流轉(zhuǎn),通過不斷讀取創(chuàng)建的流程節(jié)點(diǎn)實(shí)現(xiàn)流程流轉(zhuǎn)。
2. Activiti7概述
2.1 Activiti介紹
Activiti 是一個(gè)工作流引擎, activiti 可以將業(yè)務(wù)系統(tǒng)中復(fù)雜的業(yè)務(wù)流程抽取出來,使用專門的建模語言(BPMN2.0)進(jìn)行定義,業(yè)務(wù)系統(tǒng)按照預(yù)先定義的流程進(jìn)行執(zhí)行,實(shí)現(xiàn)了業(yè)務(wù)系統(tǒng)的業(yè)務(wù)流程由 activiti 進(jìn)行管理,減少業(yè)務(wù)系統(tǒng)由于流程變更進(jìn)行系統(tǒng)升級改造的工作量,從而提高系統(tǒng)的健壯性,同時(shí)也減少了系統(tǒng)開發(fā)維護(hù)成本。
當(dāng)然這里還有一些小故事,Alfresco 軟件在 2010 年 5 月 17 日宣布 Activiti 業(yè)務(wù)流程管理(BPM)開源項(xiàng)目的正式啟動, 其首席架構(gòu)師由業(yè)務(wù)流程管理 BPM 的專家 Tom Baeyens 擔(dān)任, Tom Baeyens 就是原來 jbpm 的架構(gòu)師,而 jbpm 是一個(gè)非常有名的工作流引擎,當(dāng)然 activiti 也是一個(gè)工作流引擎。
下邊介紹三個(gè)名詞概念,就不長篇大論了,簡單總結(jié)下。
BPM:BPM(Business Process Management),即業(yè)務(wù)流程管理。
BPM系統(tǒng):那就是業(yè)務(wù)流程管理的系統(tǒng)。
BPMN,這個(gè)比較噢重要,多說兩句,具體往下看。
BPMN(Business Process Model And Notation) - 業(yè)務(wù)流程模型和符號 是由 BPMI(BusinessProcess Management Initiative)開發(fā)的一套標(biāo)準(zhǔn)的業(yè)務(wù)流程建模符號,使用 BPMN 提供的符號可以創(chuàng)建業(yè)務(wù)流程。
總結(jié)來說就是用來建模業(yè)務(wù)流程的標(biāo)準(zhǔn)規(guī)則,一個(gè)個(gè)符號!
2.2 Activiti使用
一般情況下都是通過創(chuàng)建BPMN進(jìn)行業(yè)務(wù)流程建模,兩種方式,idea插件或者eclipse插件,通過符號創(chuàng)建流程。
idea安裝bpmn插件
在 IDEA 的 File 菜單中找到子菜單”Settings”,后面我們再選擇左側(cè)的“plugins”菜單,如下圖所示
3. Activiti環(huán)境配置
3.1 創(chuàng)建數(shù)據(jù)庫
CREATEDATABASEactivitiDEFAULTCHARACTERSETutf8;
3.2 初始化數(shù)據(jù)庫表:
創(chuàng)建Maven工程
加入依賴
4.0.0 com.activiti.demo activiti_demo 1.0-SNAPSHOT 1.6.6 1.2.12 org.activiti activiti-engine 7.0.0.Beta1 org.activiti activiti-spring 7.0.0.Beta1 org.activiti activiti-bpmn-model 7.0.0.Beta1 org.activiti activiti-bpmn-converter 7.0.0.Beta1 org.activiti activiti-json-converter 7.0.0.Beta1 org.activiti activiti-bpmn-layout 7.0.0.Beta1 org.activiti.cloud activiti-cloud-services-api 7.0.0.Beta1 mysql mysql-connector-java 5.1.40 junit junit 4.12 log4j log4j ${log4j.version} org.slf4j slf4j-api ${slf4j.version} org.slf4j slf4j-log4j12 ${slf4j.version} org.mybatis mybatis 3.4.5 commons-dbcp commons-dbcp 1.4 alfresco ActivitiReleases https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/ true
配置日志
#SetrootcategoryprioritytoINFOanditsonlyappendertoCONSOLE. #log4j.rootCategory=INFO,CONSOLEdebuginfowarnerrorfatal log4j.rootCategory=debug,CONSOLE,LOGFILE #SettheenterpriseloggercategorytoFATALanditsonlyappendertoCONSOLE. log4j.logger.org.apache.axis.enterprise=FATAL,CONSOLE #CONSOLEissettobeaConsoleAppenderusingaPatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601}%-6r[%15.15t]%-5p%30.30c%x-%m #LOGFILEissettobeaFileappenderusingaPatternLayout. log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=d:/axis.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601}%-6r[%15.15t]%-5p%30.30c%x-%m
配置activity.cfg.xml
編寫代碼
/** *Activiti初始化25張表 *執(zhí)行的是activiti-engine-7.0.0.Beta1.jar包下對應(yīng)不同內(nèi)置好的sql語句 *orgactivitidbdropactiviti.db2.drop.engine.sql * *@authorzrj *@date2020/12/29 *@sinceV1.0 **/ publicclassActivitiInit{ /** *方式一 */ @Test publicvoidGenActivitiTables(){ // 1.創(chuàng)建ProcessEngineConfiguration對象。第一個(gè)參數(shù):配置文件名稱;第二個(gè)參數(shù):processEngineConfiguration的bean的id ProcessEngineConfigurationprocessEngineConfiguration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml","processEngineConfiguration"); //2.創(chuàng)建ProcessEngine對象 ProcessEngineprocessEngine=processEngineConfiguration.buildProcessEngine(); //3.輸出processEngine對象 System.out.println(processEngine); } /** *方式二 */ @Test publicvoidGenActivitiTables2(){ //條件:1.activiti配置文件名稱:activiti.cfg.xml 2.bean的id="processEngineConfiguration" ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine(); System.out.println(processEngine); } }
3.3 創(chuàng)建數(shù)據(jù)庫表
執(zhí)行上邊的代碼。
3.4 數(shù)據(jù)庫表命名規(guī)則
Activiti 的表都以 ACT_開頭。第二部分是表示表的用途的兩個(gè)字母標(biāo)識。用途也和服務(wù)的 API 對應(yīng)。
ACT_RE_*: 'RE'表示 repository。這個(gè)前綴的表包含了流程定義和流程靜態(tài)資源 (圖片,規(guī)則,等等)。
ACT_RU_*: 'RU'表示 runtime。這些運(yùn)行時(shí)的表,包含流程實(shí)例,任務(wù),變量,異步任務(wù),等運(yùn)行中的數(shù)據(jù)。Activiti 只在流程實(shí)例執(zhí)行過程中保存這些數(shù)據(jù), 在流程結(jié)束時(shí)就會刪除這些記錄。這樣運(yùn)行時(shí)表可以一直很小速度很快。
ACT_HI_*: 'HI'表示 history。這些表包含歷史數(shù)據(jù),比如歷史流程實(shí)例, 變量,任務(wù)等等。
ACT_GE_*: 'GE'表示 general。通用數(shù)據(jù), 用于不同場景下
4. Activiti架構(gòu)簡介
activiti.cfg.xml
activiti 的引擎配置文件,包括:ProcessEngineConfiguration 的定義、數(shù)據(jù)源定義、事務(wù)管理器等,此文件其實(shí)就是一個(gè) spring 配置文件,下面是一個(gè)基本的配置只配置了 ProcessEngineConfiguration和數(shù)據(jù)源。
ProcessEngineConfiguration
流程引擎的配置類,通過 ProcessEngineConfiguration 可以創(chuàng)建工作流引擎 ProceccEngine,常用的兩種方法。
ProcessEngine
工作流引擎,相當(dāng)于一個(gè)門面接口,通過 ProcessEngineConfiguration 創(chuàng)建 processEngine,通過ProcessEngine 創(chuàng)建各個(gè) service 接口。
Service
通過 ProcessEngine 創(chuàng)建 Service, Service 是工作流引擎提供用于進(jìn)行工作流部署、執(zhí)行、管理的服務(wù)接口。
5. Activiti入門案例
5.1 流程定義
什么是流程定義
流程定義是線下按照 bpmn2.0 標(biāo)準(zhǔn)去描述 業(yè)務(wù)流程,通常使用 activiti-explorer(web 控制臺)或 activiti-eclipse-designer 插件對業(yè)務(wù)流程進(jìn)行建模,這兩種方式都遵循 bpmn2.0 標(biāo)準(zhǔn)。本教程使用activiti-eclipse-designer 插件完成流程建模。使用 designer 設(shè)計(jì)器繪制流程,會生成兩個(gè)文件:.bpmn和.png
創(chuàng)建bpmn文件
Palette(畫板)
在 eclipse 或 idea 中安裝 activiti-designer 插件即可使用,畫板中包括以下結(jié)點(diǎn):
Connection—連接
Event---事件
Task---任務(wù)
Gateway---網(wǎng)關(guān)
Container—容器
Boundary event—邊界事件
Intermediate event- -中間事件
流程圖設(shè)計(jì)完畢保存生成.bpmn 文件
idea創(chuàng)建bpmn
生成png圖片
第一步:將 holiday.bpmn 文件改為擴(kuò)展名 xml 的文件名稱:holiday.xml
第二步:在 holiday.xml 文件上面,點(diǎn)右鍵并選擇 Diagrams 菜單,再選擇 Show BPMN2.0 Designe
第三步:打開后的效果圖如下:
打開如下窗口,注意填寫文件名及擴(kuò)展名,選擇好保存圖片的位置:
第五步:中文亂碼的解決
打開 IDEA 安裝路徑,找到如下的安裝目錄
根據(jù)自己所安裝的版本來決定,我使用的是 64 位的 idea,所以在 idea64.exe.vmoptions 文件的最后一行追加一條命令:-Dfile.encoding=UTF-8
如下所示
一定注意,不要有空格,否則重啟 IDEA 時(shí)會打不開,然后 重啟 IDEA,把原來的 png 圖片刪掉,再重新生成,即可解決亂碼問題
5.2 部署流程
什么是流程部署
將線下定義的流程部署到 activiti 數(shù)據(jù)庫中,這就是流程定義部署,通過調(diào)用 activiti 的 api 將流程定義的 bpmn 和 png 兩個(gè)文件一個(gè)一個(gè)添加部署到 activiti 中,也可以將兩個(gè)文件打成 zip 包進(jìn)行部署。
單個(gè)文件部署方式
分別將 bpmn 文件和 png 圖片文件部署
壓縮包部署方式
/** *流程定義的部署 * activiti表有哪些? *act_re_deployment部署信息 *act_re_procdef流程定義的一些信息 *act_ge_bytearray流程定義的bpmn文件及png文件 * *@authorzrj *@date2020/12/29 *@sinceV1.0 **/ publicclassActivitiDeployment{ /** *方式一 *分別將bpmn文件和png圖片文件部署 */ @Test publicvoidactivitiDeploymentTest(){ //1.創(chuàng)建ProcessEngine對象 ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService實(shí)例 RepositoryServicerepositoryService=processEngine.getRepositoryService(); //3.進(jìn)行部署 Deploymentdeployment=repositoryService.createDeployment() .addClasspathResource("diagram/holiday.bpmn") .addClasspathResource("diagram/holiday.png") .name("請假申請單流程") .deploy(); //4.輸出部署的一些信息 System.out.println(deployment.getName()); System.out.println(deployment.getId()); } /** *方式二 *將holiday.bpmn和holiday.png壓縮成zip包 */ @Test publicvoidactivitiDeploymentTest2(){ //1.創(chuàng)建ProcessEngine對象 ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService實(shí)例 RepositoryServicerepositoryService=processEngine.getRepositoryService(); //3.轉(zhuǎn)化出ZipInputStream流對象 InputStreamis=ActivitiDeployment.class.getClassLoader().getResourceAsStream("diagram/holidayBPMN.zip"); //將inputstream流轉(zhuǎn)化為ZipInputStream流 ZipInputStreamzipInputStream=newZipInputStream(is); //3.進(jìn)行部署 Deploymentdeployment=repositoryService.createDeployment() .addZipInputStream(zipInputStream) .name("請假申請單流程") .deploy(); //4.輸出部署的一些信息 System.out.println(deployment.getName()); System.out.println(deployment.getId()); } }
操作數(shù)據(jù)表
-- activiti表有哪些? --部署信息 select*fromact_re_deployment; --流程定義的一些信息 select*fromact_re_procdef; --流程定義的bpmn文件及png文件 select*fromact_ge_bytearray;
5.3 啟動流程
/** *啟動流程實(shí)例: *前提是先已經(jīng)完成流程定義的部署工作 *背后影響的表: *act_hi_actinst已完成的活動信息 *act_hi_identitylink參與者信息 *act_hi_procinst流程實(shí)例 *act_hi_taskinst任務(wù)實(shí)例 *act_ru_execution執(zhí)行表 *act_ru_identitylink參與者信息 *act_ru_task任務(wù) * *@authorzrj *@date2020/12/29 *@sinceV1.0 **/ publicclassActivitiStartInstance{ publicstaticvoidmain(String[]args){ //1.得到ProcessEngine對象 ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine(); //2.得到RunService對象 RuntimeServiceruntimeService=processEngine.getRuntimeService(); //3.創(chuàng)建流程實(shí)例流程定義的key需要知道holiday ProcessInstanceprocessInstance=runtimeService.startProcessInstanceByKey("holiday"); //4.輸出實(shí)例的相關(guān)信息 System.out.println("流程部署ID"+processInstance.getDeploymentId()); System.out.println("流程定義ID"+processInstance.getProcessDefinitionId()); System.out.println("流程實(shí)例ID"+processInstance.getId()); System.out.println("活動ID"+processInstance.getActivityId()); } }
5.4 流程定義查詢
/** *流程定義查詢 * *@authorzrj *@date2020/12/29 *@sinceV1.0 **/ publicclassQueryProceccDefinition{ @Test publicvoidqueryProceccDefinition(){ //流程定義key StringprocessDefinitionKey="holiday"; //1.得到ProcessEngine對象 ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine(); //獲取repositoryService RepositoryServicerepositoryService=processEngine.getRepositoryService(); //查詢流程定義 ProcessDefinitionQueryprocessDefinitionQuery=repositoryService.createProcessDefinitionQuery(); //遍歷查詢結(jié)果 Listlist=processDefinitionQuery .processDefinitionKey(processDefinitionKey) .orderByProcessDefinitionVersion().desc().list(); for(ProcessDefinitionprocessDefinition:list){ System.out.println("------------------------"); System.out.println("流程部署 id :"+processDefinition.getDeploymentId()); System.out.println("流程定義id:"+processDefinition.getId()); System.out.println("流程定義名稱:"+processDefinition.getName()); System.out.println("流程定義key:"+processDefinition.getKey()); System.out.println("流程定義版本:"+processDefinition.getVersion()); } } }
5.5 流程定義刪除
/** *刪除指定流程id的流程 */ publicvoiddeleteDeployment(){ //流程部署id StringdeploymentId="8801"; //1.得到ProcessEngine對象 ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine(); //通過流程引擎獲取repositoryService RepositoryServicerepositoryService=processEngine.getRepositoryService(); //刪除流程定義,如果該流程定義已有流程實(shí)例啟動則刪除時(shí)出錯(cuò) repositoryService.deleteDeployment(deploymentId); //設(shè)置true級聯(lián)刪除流程定義,即使該流程有流程實(shí)例啟動也可以刪除,設(shè) //置為false非級別刪除方式,如果流程 repositoryService.deleteDeployment(deploymentId,true); }
5.6 流程定義資源查詢
/** *獲取資源 */ @Test publicvoidgetProcessResources()throwsIOException{ //流程定義id StringprocessDefinitionId=""; //1.得到ProcessEngine對象 ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine(); //獲取repositoryService RepositoryServicerepositoryService=processEngine.getRepositoryService(); //流程定義對象 ProcessDefinitionprocessDefinition=repositoryService .createProcessDefinitionQuery() .processDefinitionId(processDefinitionId).singleResult(); //獲取bpmn Stringresource_bpmn=processDefinition.getResourceName(); //獲取png Stringresource_png=processDefinition.getDiagramResourceName(); //資源信息 System.out.println("bpmn:"+resource_bpmn); System.out.println("png:"+resource_png); Filefile_png=newFile("d:/purchasingflow01.png"); Filefile_bpmn=newFile("d:/purchasingflow01.bpmn"); //輸出bpmn InputStreamresourceAsStream=null; resourceAsStream=repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),resource_bpmn); FileOutputStreamfileOutputStream=newFileOutputStream(file_bpmn); byte[]b=newbyte[1024]; intlen=-1; while((len=resourceAsStream.read(b,0,1024))!=-1){ fileOutputStream.write(b,0,len); } //輸出圖片 resourceAsStream=repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),resource_png); fileOutputStream=newFileOutputStream(file_png); //byte[]b=newbyte[1024]; //intlen=-1; while((len=resourceAsStream.read(b,0,1024))!=-1){ fileOutputStream.write(b,0,len); } }
審核編輯:劉清
-
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7507瀏覽量
88066 -
工作流
+關(guān)注
關(guān)注
0文章
44瀏覽量
12432 -
Activiti
+關(guān)注
關(guān)注
0文章
4瀏覽量
2761
原文標(biāo)題:工作流引擎 Activiti 入門詳解
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論