1. 什么是工作流
1.1 工作流介紹
工作流(Workflow),就是通過計算機對業務流程自動化執行管理。它主要解決的是“使在多個參與者之間按照某種預定義的規則自動進行傳遞文檔、信息或任務的過程,從而實現某個預期的業務目標,或者促使此目標的實現”。
1.2 工作流系統
什么是工作流系統
具有工作流程功能的軟件系統。用于更好的管理業務流程。
適用行業,各行各業
比如,消費品行業,制造業,電信服務業,銀證險等金融服務業,物流服務業,物業服務業,物業管理,大中型進出口貿易公司,政府事業機構,研究院所及教育服務業等,特別是大的跨國企業和集團公司。
具體場景,凡是涉及到業務流程的所有場景
關鍵業務流程:訂單、報價處理、合同審核、客戶電話處理、供應鏈管理等
行政管理類:出差申請、加班申請、請假申請、用車申請、各種辦公用品申請、購買申請、日報周報等凡是原來手工流轉處理的行政表單。
人事管理類:員工培訓安排、績效考評、職位變動處理、員工檔案信息管理等。
財務相關類:付款請求、應收款處理、日常報銷處理、出差報銷、預算和計劃申請等。
客戶服務類:客戶信息管理、客戶投訴、請求處理、售后服務管理等。
1.3 工作流實現方式
目前常見的工作流程有兩種方式:
通過狀態字段實現流程控制。原始,適合簡單流程控制。
工作流引擎實現流程控制。適用場景更廣泛,擴展性更好。
1.4 工作流實現原理
Activiti牛批之處在于,它在不改變代碼的前提下實現各種業務流程的管理,適用性,擴展性很優秀。
activiti通過創建流程實例引擎,可以實現不同流程的流轉,通過不斷讀取創建的流程節點實現流程流轉。
2. Activiti7概述
2.1 Activiti介紹
Activiti 是一個工作流引擎, activiti 可以將業務系統中復雜的業務流程抽取出來,使用專門的建模語言(BPMN2.0)進行定義,業務系統按照預先定義的流程進行執行,實現了業務系統的業務流程由 activiti 進行管理,減少業務系統由于流程變更進行系統升級改造的工作量,從而提高系統的健壯性,同時也減少了系統開發維護成本。
當然這里還有一些小故事,Alfresco 軟件在 2010 年 5 月 17 日宣布 Activiti 業務流程管理(BPM)開源項目的正式啟動, 其首席架構師由業務流程管理 BPM 的專家 Tom Baeyens 擔任, Tom Baeyens 就是原來 jbpm 的架構師,而 jbpm 是一個非常有名的工作流引擎,當然 activiti 也是一個工作流引擎。
下邊介紹三個名詞概念,就不長篇大論了,簡單總結下。
BPM:BPM(Business Process Management),即業務流程管理。
BPM系統:那就是業務流程管理的系統。
BPMN,這個比較噢重要,多說兩句,具體往下看。
BPMN(Business Process Model And Notation) - 業務流程模型和符號 是由 BPMI(BusinessProcess Management Initiative)開發的一套標準的業務流程建模符號,使用 BPMN 提供的符號可以創建業務流程。
總結來說就是用來建模業務流程的標準規則,一個個符號!
2.2 Activiti使用
一般情況下都是通過創建BPMN進行業務流程建模,兩種方式,idea插件或者eclipse插件,通過符號創建流程。
idea安裝bpmn插件
在 IDEA 的 File 菜單中找到子菜單”Settings”,后面我們再選擇左側的“plugins”菜單,如下圖所示
3. Activiti環境配置
3.1 創建數據庫
CREATEDATABASEactivitiDEFAULTCHARACTERSETutf8;
3.2 初始化數據庫表:
創建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張表 *執行的是activiti-engine-7.0.0.Beta1.jar包下對應不同內置好的sql語句 *orgactivitidbdropactiviti.db2.drop.engine.sql * *@authorzrj *@date2020/12/29 *@sinceV1.0 **/ publicclassActivitiInit{ /** *方式一 */ @Test publicvoidGenActivitiTables(){ // 1.創建ProcessEngineConfiguration對象。第一個參數:配置文件名稱;第二個參數:processEngineConfiguration的bean的id ProcessEngineConfigurationprocessEngineConfiguration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml","processEngineConfiguration"); //2.創建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 創建數據庫表
執行上邊的代碼。
3.4 數據庫表命名規則
Activiti 的表都以 ACT_開頭。第二部分是表示表的用途的兩個字母標識。用途也和服務的 API 對應。
ACT_RE_*: 'RE'表示 repository。這個前綴的表包含了流程定義和流程靜態資源 (圖片,規則,等等)。
ACT_RU_*: 'RU'表示 runtime。這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。Activiti 只在流程實例執行過程中保存這些數據, 在流程結束時就會刪除這些記錄。這樣運行時表可以一直很小速度很快。
ACT_HI_*: 'HI'表示 history。這些表包含歷史數據,比如歷史流程實例, 變量,任務等等。
ACT_GE_*: 'GE'表示 general。通用數據, 用于不同場景下
4. Activiti架構簡介
activiti.cfg.xml
activiti 的引擎配置文件,包括:ProcessEngineConfiguration 的定義、數據源定義、事務管理器等,此文件其實就是一個 spring 配置文件,下面是一個基本的配置只配置了 ProcessEngineConfiguration和數據源。
ProcessEngineConfiguration
流程引擎的配置類,通過 ProcessEngineConfiguration 可以創建工作流引擎 ProceccEngine,常用的兩種方法。
ProcessEngine
工作流引擎,相當于一個門面接口,通過 ProcessEngineConfiguration 創建 processEngine,通過ProcessEngine 創建各個 service 接口。
Service
通過 ProcessEngine 創建 Service, Service 是工作流引擎提供用于進行工作流部署、執行、管理的服務接口。
5. Activiti入門案例
5.1 流程定義
什么是流程定義
流程定義是線下按照 bpmn2.0 標準去描述 業務流程,通常使用 activiti-explorer(web 控制臺)或 activiti-eclipse-designer 插件對業務流程進行建模,這兩種方式都遵循 bpmn2.0 標準。本教程使用activiti-eclipse-designer 插件完成流程建模。使用 designer 設計器繪制流程,會生成兩個文件:.bpmn和.png
創建bpmn文件
Palette(畫板)
在 eclipse 或 idea 中安裝 activiti-designer 插件即可使用,畫板中包括以下結點:
Connection—連接
Event---事件
Task---任務
Gateway---網關
Container—容器
Boundary event—邊界事件
Intermediate event- -中間事件
流程圖設計完畢保存生成.bpmn 文件
idea創建bpmn
生成png圖片
第一步:將 holiday.bpmn 文件改為擴展名 xml 的文件名稱:holiday.xml
第二步:在 holiday.xml 文件上面,點右鍵并選擇 Diagrams 菜單,再選擇 Show BPMN2.0 Designe
第三步:打開后的效果圖如下:
打開如下窗口,注意填寫文件名及擴展名,選擇好保存圖片的位置:
第五步:中文亂碼的解決
打開 IDEA 安裝路徑,找到如下的安裝目錄
根據自己所安裝的版本來決定,我使用的是 64 位的 idea,所以在 idea64.exe.vmoptions 文件的最后一行追加一條命令:-Dfile.encoding=UTF-8
如下所示
一定注意,不要有空格,否則重啟 IDEA 時會打不開,然后 重啟 IDEA,把原來的 png 圖片刪掉,再重新生成,即可解決亂碼問題
5.2 部署流程
什么是流程部署
將線下定義的流程部署到 activiti 數據庫中,這就是流程定義部署,通過調用 activiti 的 api 將流程定義的 bpmn 和 png 兩個文件一個一個添加部署到 activiti 中,也可以將兩個文件打成 zip 包進行部署。
單個文件部署方式
分別將 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.創建ProcessEngine對象 ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService實例 RepositoryServicerepositoryService=processEngine.getRepositoryService(); //3.進行部署 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.創建ProcessEngine對象 ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService實例 RepositoryServicerepositoryService=processEngine.getRepositoryService(); //3.轉化出ZipInputStream流對象 InputStreamis=ActivitiDeployment.class.getClassLoader().getResourceAsStream("diagram/holidayBPMN.zip"); //將inputstream流轉化為ZipInputStream流 ZipInputStreamzipInputStream=newZipInputStream(is); //3.進行部署 Deploymentdeployment=repositoryService.createDeployment() .addZipInputStream(zipInputStream) .name("請假申請單流程") .deploy(); //4.輸出部署的一些信息 System.out.println(deployment.getName()); System.out.println(deployment.getId()); } }
操作數據表
-- activiti表有哪些? --部署信息 select*fromact_re_deployment; --流程定義的一些信息 select*fromact_re_procdef; --流程定義的bpmn文件及png文件 select*fromact_ge_bytearray;
5.3 啟動流程
/** *啟動流程實例: *前提是先已經完成流程定義的部署工作 *背后影響的表: *act_hi_actinst已完成的活動信息 *act_hi_identitylink參與者信息 *act_hi_procinst流程實例 *act_hi_taskinst任務實例 *act_ru_execution執行表 *act_ru_identitylink參與者信息 *act_ru_task任務 * *@authorzrj *@date2020/12/29 *@sinceV1.0 **/ publicclassActivitiStartInstance{ publicstaticvoidmain(String[]args){ //1.得到ProcessEngine對象 ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine(); //2.得到RunService對象 RuntimeServiceruntimeService=processEngine.getRuntimeService(); //3.創建流程實例流程定義的key需要知道holiday ProcessInstanceprocessInstance=runtimeService.startProcessInstanceByKey("holiday"); //4.輸出實例的相關信息 System.out.println("流程部署ID"+processInstance.getDeploymentId()); System.out.println("流程定義ID"+processInstance.getProcessDefinitionId()); System.out.println("流程實例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(); //遍歷查詢結果 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(); //刪除流程定義,如果該流程定義已有流程實例啟動則刪除時出錯 repositoryService.deleteDeployment(deploymentId); //設置true級聯刪除流程定義,即使該流程有流程實例啟動也可以刪除,設 //置為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); } }
審核編輯:劉清
-
計算機
+關注
關注
19文章
7425瀏覽量
87724 -
工作流
+關注
關注
0文章
44瀏覽量
12415 -
Activiti
+關注
關注
0文章
4瀏覽量
2748
原文標題:工作流引擎 Activiti 入門詳解
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論