工作流程學習——Activiti流程變數五步曲,工作流程activiti
一、前言
上一篇文章我們將流程執行個體的啟動與查詢,任務的辦理查詢都進行了介紹,我們這篇文章來介紹activiti中的流程變數。
二、本文
流程變數與我們平常理解的變數是一樣的,只不過是用在了我們activiti中,所以稱為流程變數,流程變數在整個工作流程扮演著很重要的角色。
例如,請假流程中有請假天數、請假原因等一些參數都是流程變數使用的範圍,流程變數的範圍範圍是只對應一個流程執行個體。也就是說各個流程執行個體的流程變數是不互相影響的。流程執行個體結束完成以後流程變數還儲存在資料庫中(存放在流程變數的曆史表中)。
關於流程執行個體的例子,我們先來看下流程圖的processVariables.bpmn的設定檔:
<?xml version="1.0" encoding="UTF-8"?><definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <process id="processVariables" name="processVariables【流程請假】" isExecutable="true"> <startEvent id="startevent1" name="Start"></startEvent> <endEvent id="endevent1" name="End"></endEvent> <userTask id="usertask1" name="提交申請"></userTask> <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow> <userTask id="usertask2" name="審批【總經理】" activiti:assignee="王二"></userTask> <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow> <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_processVariables"> <bpmndi:BPMNPlane bpmnElement="processVariables" id="BPMNPlane_processVariables"> <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> <omgdc:Bounds height="35.0" width="35.0" x="350.0" y="90.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> <omgdc:Bounds height="35.0" width="35.0" x="350.0" y="420.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"> <omgdc:Bounds height="55.0" width="105.0" x="315.0" y="190.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2"> <omgdc:Bounds height="55.0" width="105.0" x="315.0" y="300.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> <omgdi:waypoint x="367.0" y="125.0"></omgdi:waypoint> <omgdi:waypoint x="367.0" y="190.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> <omgdi:waypoint x="367.0" y="245.0"></omgdi:waypoint> <omgdi:waypoint x="367.0" y="300.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> <omgdi:waypoint x="367.0" y="355.0"></omgdi:waypoint> <omgdi:waypoint x="367.0" y="420.0"></omgdi:waypoint> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram></definitions>
一個很簡單的流程圖processVariables.png:
部署流程定義:
/** * 部署流程定義(從inputStream) */@Testpublic void deploymentProcessDefinition_inputStream() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();InputStream inputStreamBpmn = this.getClass().getResourceAsStream("/diagrams/processVariables.bpmn");InputStream inputStreamPng = this.getClass().getResourceAsStream("/diagrams/processVariables.png");Deployment deployment = processEngine.getRepositoryService()// 與流程定義和部署對象相關的Service.createDeployment()// 建立一個部署對象.name("流程定義")// 添加部署名稱.addInputStream("processVariables.bpmn", inputStreamBpmn)// 使用資源檔的名稱(要求:與資源檔的名稱要一致),和輸入資料流完成部署.addInputStream("processVariables.png", inputStreamPng)// 使用資源檔的名稱(要求:與資源檔的名稱要一致),和輸入資料流完成部署.deploy();// 完成部署System.out.println("部署ID:" + deployment.getId());System.out.println("部署名稱:" + deployment.getName());}
運行結果:
部署ID:701
部署名稱:流程定義
啟動流程執行個體:
/** * 啟動流程執行個體 */@Testpublic void startProcessInstance() {// 流程定義的keyString processDefinitionKey = "processVariables";ProcessInstance pi = processEngine.getRuntimeService()// 與正在執行的流程執行個體和執行對象相關的service.startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啟動流程執行個體,key對應processVariables檔案中的id的屬性值,使用key值啟動,預設是按照最新版本進行啟動System.out.println("流程執行個體ID:" + pi.getId());System.out.println("流程定義ID:" + pi.getProcessDefinitionId());System.out.println("流程執行個體ID" + pi.getProcessInstanceId());}
運行結果:
流程執行個體ID:801
流程定義ID:processVariables:1:704
流程執行個體ID801
查詢任務
/** * 查詢任務通過流程執行個體id */@Testpublic void findTask(){String processInstanceId="801";List<HistoricTaskInstance> list = processEngine.getHistoryService()//與曆史資料(曆史表)相關的service.createHistoricTaskInstanceQuery()//建立曆史任務執行個體查詢.processInstanceId(processInstanceId).list();if(list!=null && list.size()>0){for(HistoricTaskInstance hti:list){System.out.println(hti.getId()+" "+hti.getName()+" "+hti.getProcessInstanceId()+" "+hti.getStartTime()+" "+hti.getEndTime()+" "+hti.getDurationInMillis());System.out.println("################################");}}}
運行結果:
804 提交申請 801 Fri Jun 26 10:55:02 CST2015 null null
################################
關於部署流程定義、啟動流程執行個體和查詢正在辦理的任務我們前面的文章已經介紹過了,所以我們不再詳細介紹,下面開始我們的設定流程變數,設定流程變數我們這裡提供了兩種方式,分別是使用基礎資料型別 (Elementary Data Type)和使用javabean的方法,同意擷取流程變數也是不一樣的:
使用基礎資料型別 (Elementary Data Type):
設定流程變數
/** * 設定流程變數 */@Testpublic void setVariables() {// 與任務相關的service,正在執行的serviceTaskService taskService = processEngine.getTaskService();// 任務IDString taskId = "804";// 1.設定流程變數,使用基礎資料型別 (Elementary Data Type)taskService.setVariable(taskId, "請假天數", 7);// 與任務ID邦德taskService.setVariable(taskId, "請假日期", new Date());taskService.setVariableLocal(taskId, "請假原因", "回去探親,一起吃個飯123");System.out.println("設定流程變數成功!");}
運行結果:
設定流程變數成功!
擷取流程變數
/** * 擷取流程變數 */@Testpublic void getVariables() {// 與任務(正在執行的service)TaskService taskService = processEngine.getTaskService();// 任務IdString taskId = "804";// 1.擷取流程變數,使用基礎資料型別 (Elementary Data Type)Integer days = (Integer) taskService.getVariable(taskId, "請假天數");Date date = (Date) taskService.getVariable(taskId, "請假日期");String reason = (String) taskService.getVariable(taskId, "請假原因");System.out.println("請假天數:" + days);System.out.println("請假日期:" + date);System.out.println("請假原因:" + reason);}
運行結果:
請假天數:7
請假日期:Fri Jun 2611:07:28 CST 2015
請假原因:回去探親,一起吃個飯123
使用javabean
JavaBean的Person類
package com.tgb;import java.io.Serializable;import java.util.Date;public class Person implements Serializable {private static final long serialVersionUID = 361866001729020143L;//請假天數private int id;//請假人private String name;//請假原因private String note;//請假時間private Date date;public Date getDate() {return date;}public void setDate() {this.date = new Date();}public String getNote() {return note;}public void setNote(String note) {this.note = note;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
設定流程變數
/** * 設定流程變數 */@Testpublic void setVariables() {// 與任務相關的service,正在執行的serviceTaskService taskService = processEngine.getTaskService();// 任務IDString taskId = "804";// 設定流程變數,使用javaBean方法/** * 當一個javaBean(實現序號)放置到流程變數中,要求javabean的屬性不能在發生變化 如果發生變化,再擷取時,拋出異常 * * 解決方案:在person對象中添加: private static final long * serialVersionUID="6757393795687480331L"; 同時實現序號介面 * */Person p = new Person();p.setName("翠花");p.setId(20);p.setDate();;p.setNote("回去探親,一起吃個飯123");taskService.setVariable(taskId, "人員資訊(添加固定版本)", p);System.out.println("設定流程變數成功!");}
運行結果:
設定流程變數成功!
擷取流程變數
/** * 擷取流程變數 */@Testpublic void getVariables() {// 與任務(正在執行的service)TaskService taskService = processEngine.getTaskService();// 任務IdString taskId = "804";// 2.擷取流程變數,使用javaBean類型Person p = (Person)taskService.getVariable(taskId, "人員資訊(添加固定版本)");System.out.println(" 請假人: "+p.getName()+" 請假天數: "+p.getId()+" 請假時間:"+ p.getDate()+ " 請假原因: "+p.getNote());}
運行結果:
請假人: 翠花 請假天數: 20 請假時間:Fri Jun 26 11:13:44 CST 2015 請假原因: 回去探親,一起吃個飯123
查詢曆史流程變數
可以根據變數名稱查詢該變數的所有曆史資訊
可以根據變數名稱查詢該變數的所有曆史資訊/** * 查詢流程變數的曆史表 */@Testpublic void findHistoryProcessVariables(){List<HistoricVariableInstance> list = processEngine.getHistoryService().createHistoricVariableInstanceQuery()//建立一個曆史的流程變數查詢對象.variableName("請假原因").list();if (list!=null &&list.size()>0) {for (HistoricVariableInstance hvi : list) {System.out.println(hvi.getId()+" "+hvi.getProcessInstanceId()+" "+hvi.getVariableName()+" "+hvi.getVariableTypeName()+" "+hvi.getValue());System.out.println("########################################");}}}
流程變數支援的資料類型:
流程變數支援的資料類型包括:TypeName、string、integer、short、long、double、boolean、data、binary、serializable,我們可以看出流程變數支援的包括了大部分封裝類型和Date、String和實現了Serializable介面的類的類型。
三、總結
我們這篇文章將流程變數的相關知識進行了介紹,除了介紹流程變數的相關定義外還通過具體代碼例子介紹了通過不同方式來設定和擷取流程變數以及流程變數支援的資料類型。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。