activiti工作流简介
?
工作流簡介
工作流定義
工作流:
? ? 就是“業務過程的部分或整體在計算機應用環境下的自動化”,它主要解決的是“使在多個參與者之間按照某種預定義的規則傳遞文檔、信息或任務的過程自動進行,從而實現某個預期的業務目標,或者促使此目標的實現”。
工作流管理系統(Workflow Management System, WfMS):
? ? 工作流管理系統是一個軟件系統,它完成工作量的定義和管理,并按照在系統中預先定義好的工作流規則進行工作流實例的執行。工作流管理系統不是企業的業務系統,而是為企業的業務系統的運行提供了一個軟件的支撐環境。
? ? 主要工作:
? ? 1、定義工作流:包括具體的活動、規則等。
? ? 2、執行工作流:按照流程定義的規則執行,并由多個參與者進行控制。
工作流特點
采用工作流有以下優點:
? ? 1、提高系統的柔性,適應業務流程的變化?
? ? 2、實現更好的業務過程控制,提高顧客服務質量
? ? 3、降低系統開發和維護成本
常見工作流:Activiti、JBPM、OSWorkflow、ActiveBPEL、YAWL等。
activiti工作流
activiti簡介
Activiti5是由Alfresco軟件在2010年5月17日發布的業務流程管理(BPM)框架,它是覆蓋了業務流程管理、工作流、服務協作等領域的一個開源的、靈活的、易擴展的可執行流程語言框架。
Activiti基于Apache許可的開源BPM平臺,創始人Tom Baeyens是JBoss Activiti的項目架構師。
工作流引擎
ProcessEngine對象是Activiti工作的核心。負責生成流程運行時的各種實例及數據、監控和管理流程的運行,其他的類都是由他而來。
產生方式:
首先需要先創建Activiti配置對象的實例ProcessEngineConfiguration,里面主要配置相關數據源參數,支持基于配置文件和注解的創建。
?
然后通過ProcessEngineConfiguration創建工作流引擎,舉例如下(這里列舉基于spring的SpringProcessEngineConfiguration作為ProcessEngineConfigurationImpl的配置實現):
ProcessEngine processEngine =? springProcessEngineConfiguration.buildProcessEngine();
ProcessEngine 可以產生RepositoryService、RuntimeService、TaskService等服務類。舉例如下:
RepositoryService repositoryService =? processEngine.getRepositoryService();
各個Service的作用:
| RepositoryService | 管理流程定義 |
| RuntimeService | 執行管理,包括啟動、推進、刪除流程實例等操作 |
| TaskService | 任務管理 |
| HistoryService | 歷史管理(執行完的數據的管理) |
| IdentityService | 組織機構管理 |
| FormService | 一個可選服務,任務表單管理 |
| ManagerService | ? |
?
RepositoryService
? ??RepositoryService是Activiti的倉庫服務類,用于定義、部署和配置流程。
RuntimeService
? ??RuntimeService是activiti的流程執行服務類。可以從這個服務類中獲取很多關于正在執行的流程相關的信息。
TaskService
? ??TaskService是activiti的流程任務服務類。可以從這個類中獲取任務的信息。
HistoryService
? ??HistoryService是activiti的查詢歷史信息的類。在一個流程執行完成后,這個對象為我們提供查詢歷史信息。
Deployment
? ??部署對象,用于部署流程定義文件(bpmn、png等文件),也可對流程進行修改和刪除。
ProcessDefinition
? ??流程定義類,解析.bpmn后得到的流程定義規則的信息,工作流系統就是按照流程定義的規則執行的,通常用于查詢部署的流程定義和資源。
ProcessInstance
? ??ProcessInstance代表流程定義的執行實例。如A請了一天的假,他就必須發出一個流程實例的申請。一個流程實例包括了所有的運行節點。我們可以利用這個對象來了解當前流程實例的進度等信息。
流程實例就表示一個流程從開始到結束的最大的流程分支,即一個流程中流程實例只有一個。
Execution
? ??執行對象。Activiti用這個對象去描述流程執行的每一個節點。一個流程中,執行對象可以存在多個,但是流程實例只能有一個。在單線流程中,Execution就是同ProcessInstance,在多線流程中,分線路中每個活動代表Execution。如下圖的示例:
BPMN
activiti基于BPMN規范引入了很多組件,下面列出一些常用的組件模塊。
start事件
首先解釋一下事件:事件用于對發生在流程生命周期的事情進行建模。事件總是被形象成一個圓圈。在 BPMN 2.0 中,存在兩種主要的事件類型:捕獲事件和拋出事件。
? ? ? ?捕獲:流程執行到該事件時,會等待事件觸發。事件觸發類型由內部圖標或 XML 中的類型聲明來定義。捕獲事件視覺上可以通過里面沒有填充的內部圖標與拋出事件進行區分(也就是說,圖標是白色的)。
? ? ? ?拋出:流程執行到該事件時,事件就會被觸發。該事件觸發的類型由內部圖標或 XML 中的類型聲明來定義。拋出事件視覺上可以通過內部圖標與拋出的事件進行區分,拋出事件的圖標使用黑色填充。
start 事件表示流程的開始。定義了流程如何被啟動的 start 事件類型。start 事件總是捕獲型的,start事件通常包括,none start事件和timer start事件。
none start事件不需要觸發器就能發生,一般通過調用 startProcessInstanceByXXX 方法啟動流程實例的時候觸發。none start 事件被形象化成不帶內圖標的圓(即,沒有觸發器類型)。如下圖:
XML表示:
| <startEvent id="start" name="my start event" /> |
?
timer start 事件用于在給定的時間點創建流程實例。它可以用在只啟動一次的流程中,也可以用在特定時間間隔下啟動的流程。其圖標被形象話為有表的內圖標的圓,如下圖:
XML表示(示例為從2017年3月11日12:13開始,流程將啟動4次每次間隔5分鐘):
| <startEvent id="theStart"> <timerEventDefinition> <timeCycle>R4/2017-03-11T12:13/PT5M</timeCycle> </timerEventDefinition> </startEvent> |
end事件
結束事件表明流程或子流程(執行路徑)的結束。結束事件總是拋出型的。這意味著當流程執行到結束事件時,有一個結果會被拋出。結果的類型是以事件的內部黑色圖標來表示的。end事件包括None end事件和error end事件。none end即正常結束事件。error end事件當流程執行到error end事件時,會結束當前的執行路徑,并拋出 error。Error可以被與之匹配的中間邊界error事件捕獲。如果沒有找到匹配的邊界error事件,默認會使用none end事件。如下圖是none end事件:
XML表示:
| <endEvent id="end" name="my end event" /> |
順序流(sequence flow)
順序流是兩個流程元素的連接器。一個元素在流程執行期間被訪問后,流程會沿著該元素所有輸出的順序流繼續執行。順序流上也可帶條件一般結合gateway使用。圖標如下所示:
XML表示:
| <sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" /> |
排他網關(Exclusive Gateway)
也叫單一網關,用來對流程中的決定進行建模。流程執行到這種gateway時,按照輸出流定義的順序對它們進行計算。條件為 true 的順序流(或沒有設置條件,概念上順序流上定義為’true’)被選取繼續執行流程。
注意:在多個順序流條件為true 的情況下,XML 中最先定義的那個被選取來繼續流程的執行(僅有那個會被選中)。如果沒有選取到任何順序流,就會拋出異常。
如下圖所示:
?
XML表示:
| <exclusiveGateway id="exclusiveGw" name="Exclusive Gateway" /> <sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="theTask1"> <conditionExpression xsi:type="tFormalExpression">${input == 1}</conditionExpression> </sequenceFlow> <sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="theTask2"> <conditionExpression xsi:type="tFormalExpression">${input == 2}</conditionExpression> </sequenceFlow> <sequenceFlow id="flow4" sourceRef="exclusiveGw" targetRef="theTask3"> <conditionExpression xsi:type="tFormalExpression">${input == 3}</conditionExpression> </sequenceFlow> |
并行網關(Parallel Gateway)
Parallel gateway能拆分出多個執行路徑,或多個輸入執行路徑進行合并,通常先通過拆分的網關拆分成多個并行的順序流,然后再通過合并網關進行合并:
? ? 拆分(fork):并行執行所有的輸出順序流,為每一個順序流創建一個并行執行路徑。
? ? 合并(join):所有到達 parallel gataway 的并發性的執行路徑都等待于此,直到每個輸入流都執行到。然后,流
程經由 joining gateway 繼續向下執行。
如下圖所示:
上例中,XML表示:
| <parallelGateway id="myParallelGateway" /> <startEvent id="theStart" /> <sequenceFlow id="flow1" sourceRef="theStart" targetRef="fork" /> <parallelGateway id="fork" /> <sequenceFlow sourceRef="fork" targetRef="receivePayment" /> <sequenceFlow sourceRef="fork" targetRef="shipOrder" /> <userTask id="receivePayment" name="Receive Payment" /> <sequenceFlow sourceRef="receivePayment" targetRef="join" /> <userTask id="shipOrder" name="Ship Order" /> <sequenceFlow sourceRef="shipOrder" targetRef="join" /> <parallelGateway id="join" /> <sequenceFlow sourceRef="join" targetRef="archiveOrder" /> <userTask id="archiveOrder" name="Archive Order" /> <sequenceFlow sourceRef="archiveOrder" targetRef="theEnd" /> <endEvent id="theEnd" /> |
用戶任務(User Task)
用戶任務用來對那些需要人參與完成的工作進行建模。當流程執行到這樣的用戶任務時,會在分配任務的用戶或用戶組的任務列表中創建新的任務。
如下圖所示:
XML表示:
| <userTask id="inspector_downpayment_approve_task" name="包賣付款審核" activiti:candidateGroups="inspector_downpayment_approve"><documentation>包賣付款審核</documentation> </userTask> |
?
?
數據庫
ACT_RE_*: 'RE'表示repository。 這個前綴的表包含了流程定義和流程靜態資源 (圖片,規則,等等)。
ACT_RU_*: 'RU'表示runtime。 這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。 Activiti只在流程實例執行過程中保存這些數據, 在流程結束時就會刪除這些記錄。 這樣運行時表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 這些表包含身份信息,比如用戶,組等等。
ACT_HI_*: 'HI'表示history。 這些表包含歷史數據,比如歷史流程實例, 變量,任務等等。
ACT_GE_*: 通用數據, 用于不同場景下,如存放資源文件。
表摘要如下:
| ACT_EVT | ACT_EVT_LOG | 事件日志表 |
| ACT_GE_* | ACT_GE_BYTEARRAY | 二進制數據表,存儲流程定義相關的部署信息。即流程定義文檔的存放地。每部署一次就會增加兩條記錄,一條是關于bpmn規則文件的,一條是圖片的(如果部署時只指定了bpmn一個文件,activiti會在部署時解析bpmn文件內容自動生成流程圖)。兩個文件都是以二進制形式存儲在數據庫中 |
| ACT_GE_PROPERTY | 屬性數據表,存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄。 | |
| ACT_HI_* | ACT_HI_ACTINST | 歷史節點表,存放歷史所有完成的活動。 |
| ACT_HI_ATTACHMENT | 歷史附件表 | |
| ACT_HI_COMMENT | 歷史意見表 | |
| ACT_HI_DETAIL | 歷史詳情表,提供歷史變量的查詢 | |
| ACT_HI_IDENTITYLINK | 歷史流程人員表,存儲任務的辦理人,包括個人任務和組任務,表示歷史任務 | |
| ACT_HI_PROCINST | 歷史流程實例表,存儲已經執行完的歷史流程實例信息 | |
| ACT_HI_TASKINST | 歷史流程任務表,存儲已經執行完的歷史任務信息 | |
| ACT_HI_VARINST | 歷史變量表,存儲已經執行完的歷史流程變量信息 | |
| ACT_ID_* | ACT_ID_GROUP | 用戶組信息表 |
| ACT_ID_INFO | 用戶擴展信息表 | |
| ACT_ID_MEMBERSHIP | 用戶與用戶組關系信息表 | |
| ACT_ID_USER | 用戶信息表 | |
| ACT_RE_* | ACT_RE_DEPLOYMENT | 部署信息表,存放流程定義的顯示名和部署時間 |
| ACT_RE_MODEL | 流程設計模型部署表,存儲流程定義的數據信息。 | |
| ACT_RE_PROCDEF | 流程定義數據表,存放流程定義的屬性信息,部署每個新的流程定義都會在這張表中增加一條記錄。注意:當流程定義的key相同的情況下,使用的是版本升級 | |
| ACT_RU_* | ACT_RU_EVENT_SUBSCR | throwEvent、catchEvent時間監聽信息表 |
| ACT_RU_EXECUTION | 運行時流程執行對象表,當流程達到一個節點中時,會在執行對象表中產生一條數據,當流程結束后,流程實例將會在正在執行的執行對象表中被刪除 | |
| ACT_RU_IDENTITYLINK | 運行時流程人員表,主要存儲任務的辦理人,包括個人任務和組任務,表示正在執行的任務 | |
| ACT_RU_JOB | 運行時定時任務數據表 | |
| ACT_RU_TASK | 運行時任務節點表,當流程達到一個節點中時,會在執行對象表中產生一條數據,如果當前節點是用戶任務節點,這時也會在用戶任務節點表中增加一條記錄,當流程結束后,流程實例將會在正在執行的任務節點表中被刪除 | |
| ACT_RU_VARIABLE | 運行時流程變量數據表,設置流程變量的時候,向act_ru_variable這個表添加數據 |
流程的定義、管理、執行和部署
流程的定義和部署
? ? 流程的定義、部署、查詢、和刪除的代碼示例如下:
| @Autowired private ProcessEngine processEngine; /**部署流程定義*/ @Test public void deploy(){String bpmnClassPath = "bpmn/test_process.bpmn20.xml";Deployment deployment = processEngine.getRepositoryService().createDeployment().addClasspathResource(bpmnClassPath).deploy();System.out.println(deployment.getId()+" "+deployment.getName()); } /**查看流程定義*/ @Test public void queryProcessDefinition() throwsException {//獲取倉庫服務對象,使用版本的升序排列,查詢列表List<ProcessDefinition> pdList = processEngine.getRepositoryService().createProcessDefinitionQuery()//添加查詢條件//.processDefinitionKey(processDefinitionKey)//排序.orderByProcessDefinitionVersion().asc().list();//查詢的結果集//遍歷集合,查看內容for(ProcessDefinition pd : pdList) {System.out.println("id:" + pd.getId());System.out.println("name:" + pd.getName());System.out.println("key:" + pd.getKey());System.out.println("version:" + pd.getVersion());System.out.println("resourceName:"+pd.getDiagramResourceName());System.out.println("***************************************");} } @Test public void deleteDeployment() throws Exception {//刪除發布信息String deploymentId = "1";//獲取倉庫服務對象RepositoryService repositoryService = processEngine.getRepositoryService();//普通刪除,如果當前規則下有正在執行的流程,則拋異常//repositoryService.deleteDeployment(deploymentId);//級聯刪除,會刪除和當前規則相關的所有信息,正在執行的信息,也包括歷史信息//相當于:repositoryService.deleteDeploymentCascade(deploymentId);repositoryService.deleteDeployment(deploymentId,true); } |
流程實例、任務的執行
? ??啟動流程實例、查詢流程任務、辦理任務的代碼示例如下:
| /*啟動流程實例*/ @Test public void startProcess() throws Exception {//通過流程定義的key啟動流程,會啟動版本最高的流程ProcessInstance pi = processEngines.getRuntimeService()//獲取正在執行的Service.startProcessInstanceByKey("myProcess");//按照流程定義的key啟動流程實例,默認按照最新版本啟動System.out.println("pid:" + pi.getId() +",activitiId:" + pi.getActivitiId()+",pdId:"+pi.getProcessDefinitionId()); } /*查看個人任務*/ @Test public void startProcess() throws Exception {//配置查詢對象String assignee="張三";//創建任務查詢對象,查詢個人任務List<Task> list = processEngine.getTaskService().createTaskQuery().taskAssignee(assignee)//指定個人任務的辦理人查詢任務.orderByTaskCreateTime().desc()//按照任務創建時間升序排列.list();//查詢任務的所有記錄System.out.println("======================【"+assignee+"】的個人任務列表=================");for(Task task: list) {System.out.print("id:"+task.getId()+",");System.out.print("name:"+task.getName()+",");System.out.print("createTime:"+task.getCreateTime()+",");System.out.println("assignee:"+task.getAssignee());} } /*辦理任務*/ @Test public void complete() throws Exception {String taskId = "1102";//完成任務processEngine.getTaskService().complete(taskId);//指定任務ID,完成任務 } |
流程變量
流程變量指流程實例中可能存在變化的量,比如請假流程中有請假天數、請假原因等一些參數都為流程變量的范圍。如下圖所示:
| /**設置流程變量*/ @Test public void setVariables(){//獲取執行的ServiceTaskService taskService = processEngine.getTaskService();//指定辦理人String assigneeUser = "張三";//流程實例IDString processInstanceId = "1701";Task task = taskService.createTaskQuery().taskAssignee(assigneeUser)//指定辦理人.processInstanceId(processInstanceId)//指定流程實例ID.singleResult();/**一:變量中存放基本數據類型*///taskService.setVariable(task.getId(), "請假人","李四");//使用流程變量的名稱和流程變量的值設置流程變量,一次只能設置一個值//taskService.setVariable(task.getId(), "請假天數",3);//taskService.setVariable(task.getId(), "請假日期",new Date());/**二:變量中存放javabean對象,前提:讓javabean對象實現implementsjava.io.Serializable*/Person p = new Person();p.setId(1L);p.setName("王五");taskService.setVariable(task.getId(), "人員信息",p);/**三:也可設置多個參數taskService.setVariables(taskId, variablesMap); } |
用戶管理
主要包括創建用戶,創建組,以及建立組和用戶的關系。具體用的數據庫表包括:
act_id_group:角色組表
act_id_user:用戶表:
act_id_membership:用戶角色表
總結
以上是生活随笔為你收集整理的activiti工作流简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 球衣颜色
- 下一篇: 数学逻辑习题集(1)