寫於2018-03-28html
背景:
在計算機還沒有普及時,許多工做流程採用手工傳遞紙張表單的方式,一級一級審批簽字, 工做效率很是低下,對於數據統計以及生成報表的功能,須要通過大量的手工操做才能實現。 隨着電腦的普及,這些工做的參與者只須要在電腦的系統中填入工做內容,系統就會按照定義好的流程自動執行,各級審批者能夠獲得工做的信息並做出相應的審批和管理操做,數據統計和報表的生成均由系統代爲完成,這樣大大提升了工做效率,在這種背景下,各類工做流應用以及中間件應運而生前端
定義:
工做流(Workflow),是對工做流程及其各操做步驟之間業務規則的抽象、歸納、描述。 工做流建模,即將工做流程中的工做如何先後組織在一塊兒的邏輯和規則在計算機中以恰當的 模型進行表示並對其實施計算。工做流要解決的主要問題是:爲實現某個業務目標,在多個參與者之間,利用計算機,按某種預約規則自動傳遞文檔、信息或者任務。java
適用行業:
製造業,電信服務業,銀證保險等金融服務業,物流服務業,物業服務業,物業管理,大中型進出口貿易公司,政府事業機構,研究院所及教育服務業等,大型企業集團。
PS:21世紀初工做流曾是當時IT行業最熱門的概念之一,就像今天的區塊鏈。node
BPMN:
BPMN 規範 1.0 版本由 BPMI 組織於 2004 年發佈,全稱是 Business Process Modeling Notation,BPMN 規範的發佈是爲了讓業務流程的所有參與人員對流程能夠進行可視化管理,提供一套讓全部參與人員都易於理解的語言和標記,爲業務流程的設計人員(非技術人員)和流程的實現人員(技術人員)創建起一座橋樑。BPMN2.0 規範於 2011 年 1 月正式發佈,而且全稱改成 Business Process Model And Notation(業務流程模型和符號)。BPMN 2.0 流程定義模型不只僅能夠在任何兼容 BPMN 2.0 的引擎中執行,並且也能夠在圖形編輯器間交換。做爲一個標準,BPMN 2.0 統一了工做流社區。mysql
工做流引擎選擇(Java):
一、最原始的「工做流實現」,拼接處理頁面,經過數據庫表當前處理人的變動實現流轉。
優勢:簡單。缺點:硬編碼,強耦合。
二、自研實現工做流,如多數國內的OA系統。
優勢:定製化程度高。缺點:研發資源投入較高,對核心研發人員技術要求很高。
三、國內收費工做流引擎。
優勢:多數是在開源引擎上作了二次封裝。 缺點:質量良莠不齊,通常不建議使用
四、開源工做流實現( jBPM、OSWorkflow、Activiti)。
優勢:通用靈活。缺點:爲適合國情需作二次封裝spring
某OA自研工做流核心:
一、動態表單後端DDL生成Table,前端的表單與後端生成的某個表一一對應
二、表單佈局經過存儲html片段實現
三、流程定義經過pipeinfo、nodeinfo 配置,流程實現表爲workflowbase
四、流程節點圖使用js生成sql
三大開源工做流引擎對比(Java)
Osworkflow:只提供工做流的基本功能,至關靈活,要實現業務功能須要作大量的擴展。年代比較久遠,不少資料是十多年前。(工做流使用方式與Jbpm4類似)
Jbpm:Jbpm4以後基於Drools Flow總體重構了,較Activiti重且更復雜,技術棧較陳舊(Hibernate、Ant對比Mybatis、Maven),資料較Activiti少。
Activiti: 基於Jbpm4進化而來,能較好的與Spring集成,上手較Jbpm快。數據庫
Activiti VS jBPM5:
後端
Activiti體驗-數據庫
架構
Engine 引擎核心(必須)
History 歷史流程 【可選】
Identity 用戶和用戶組【可選】
hi = history 歷史數據
id = identity 用戶及用戶組
ru = runtime 運行時數據
re = resource 流程定義及部署資源
詳細庫表說明參考:https://blog.csdn.net/rosten/article/details/35220867
Activiti體驗-app
Activiti-explorer:流程設計、流程部署、管理及簡單任務處理示例
Activiti-rest:Rest接口,可供異構系統或分佈式系統實現工做流
除了用Modeler還能夠用Active爲Eclipse提供的插件Activiti Designer設計流程
Modeler:更適合業務人員使用
Activiti Designer:更適合開發人員使用
Activiti Explorer
核心API結構
核心Service
RepositoryService: Activiti 中每個不一樣版本的業務流程的定義都須要使用一些定義文件,部署文件和支持數據 ( 例如 BPMN2.0 XML 文件,表單定義文件,流程定義圖像文件等 ),這些文件都存儲在 Activiti 內建的 Repository 中。Repository Service 提供了對 repository 的存取服務。
RuntimeService:在 Activiti 中,每當一個流程定義被啓動一次以後,都會生成一個相應的流程對象實例。Runtime Service 提供了啓動流程、查詢流程實例、設置獲取流程實例變量等功能。此外它還提供了對流程部署,流程定義和流程實例的存取服務。
TaskService:在 Activiti 中業務流程定義中的每個執行節點被稱爲一個 Task,對流程中的數據存取,狀態變動等操做均須要在 Task 中完成。Task Service 提供了對用戶 Task 和 Form 相關的操做。它提供了運行時任務查詢、領取、完成、刪除以及變量設置等功能。
IdentityService:Activiti 中內置了用戶以及組管理的功能,必須使用這些用戶和組的信息才能獲取到相應的 Task。Identity Service 提供了對 Activiti 系統中的用戶和組的管理功能。
ManagementService:Management Service 提供了對 Activiti 流程引擎的管理和維護功能,這些功能不在工做流驅動的應用程序中使用,主要用於 Activiti 系統的平常維護。
HistoryService: History Service 用於獲取正在運行或已經完成的流程實例的信息,與 Runtime Service 中獲取的流程信息不一樣,歷史信息包含已經持久化存儲的永久信息,並已經被針對查詢優化。
FormService: Activiti 中的流程和狀態 Task 都可以關聯業務相關的數據。經過使用 Form Service 能夠存取啓動和完成任務所需的表單數據而且根據須要來渲染表單
Activiti基礎-activiti.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">; <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:mysql:///activity" /> <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> <property name="jdbcUsername" value="root" /> <property name="jdbcPassword" value="admin" /> <property name="databaseSchemaUpdate" value="true" /> </bean> </beans>
Activiti基礎-部署流程
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service .createDeployment() //建立一個部署對象 .name("helloworld入門程序")//添加部署的名稱 .addClasspathResource("diagrams/MyProcess.bpmn")//從classpath的資源中加載,一次只能加載一個文件 .addClasspathResource("diagrams/MyProcess.png")//從classpath的資源中加載,一次只能加載一個文件 .deploy(); //完成部署 System.out.println("部署ID:"+deployment.getId()); //1 System.out.println("部署名稱"+deployment.getName()); //helloworld入門程序 **Activiti基礎-啓動流程** RuntimeService runtimeService = processEngine.getRuntimeService(); Map<String, Object> vars = new HashMap<String, Object>(); vars.put("varName", "變量值"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess", vars);
Activiti基礎-查詢及辦理任務
List<Task> list = taskService.createTaskQuery() .taskAssignee(「peng」)//查詢指派給peng的任務 .list(); if(list!=null && list.size()>0){ for(Task task:list){ taskService.complete(task.getId());//辦理任務 } } }
Activiti基礎-簡單流程開發步驟
一、設計流程(Modeler、Activiti Design)
二、部署流程(流程模板->流程實例->執行實例->任務)
三、啓動流程
四、全部參與方按序完成各自任務
五、任務結束,數據進入history歸檔
Activiti基礎-表單類型
一、Form properties
二、Form Key 指定一個類html模板文件
三、Form Key 指定URL
Activiti基礎-表單1
Activiti基礎-表單2和3
Activiti基礎-三種表單優缺點對比
表單1:簡單方便, 排版單1、表單裏每一個字段都會存儲到變量表,數據量大,適合極簡單業務。
表單2:排版比1靈活,適合業務簡單,排版有必定要求場景。
表單3:排版隨意,工做流與業務解耦,數據量靈活控制,但工做量較多,適合定製化要求較高場景。
Activiti基礎-用戶及用戶組
Activiti的用戶模型至關簡單:用戶、用戶組,用戶與用戶組之間是多對多的關係。
對於須要關注參與人所屬組織架構的場景(如OA)須要進行二次開發
用戶任務能夠指定:辦理人、候選人、候選組。
候選人及候選組,(競爭)簽收任務以後,就成爲當前辦理人。
Activiti基礎-批註及附件
taskService.addComment taskService.getTaskComments taskService.createAttachment taskService.getTaskAttachments
Activiti基礎-流程圖
方法1:ProcessDiagramGenerator 類:Java GUI
方法2:查詢流程模板座標點,經過JS畫線框
Activiti實戰問題: 業務數據與流程數據如何關聯:業務表裏存儲流程實例ID即processInstanceId,流程啓動時使用業務主鍵做爲businessKey。 runtimeService .startProcessInstanceByKey第二個參數指定businessKey。 業務與引擎用戶及用戶組數據同步:業務用戶、角色新增、修改時調用IdentityService同步用戶(注意事務) 查詢當前用戶做爲(候選人、候選組、參與人)任務:taskService.creteTaskQuery(). taskInvolvedUser(用戶ID) 在線設計流程:集成Modeler到業務後臺 在線部署流程:使用壓縮包部署,僅支持簡單類流程熱部署(無需寫Java代碼的)或使用動態代碼(業務規則引擎)!