日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Activiti——流程变量(六)

發布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Activiti——流程变量(六) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Activiti——流程變量

轉自:http://lib.csdn.net/article/java/66665?knId=268

流程變量在整個工作流中扮演很重要的作用。例如:請假流程中有請假天數、請假原因等一些參數都為流程變量的范圍。流程變量的作用域范圍是只對應一個流程實例。也就是說各個流程實例的流程變量是不相互影響的。流程實例結束完成以后流程變量還保存在數據庫中(存放到流程變量的歷史表中)。

一、部署流程定義

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/** 部署流程定義(從InputStream) */@Testpublic void deploymentProcessDefinition_inputStream() {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());//}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

說明:?
輸入流加載資源文件的3種方式?

二、啟動流程實例

/** 啟動流程實例 */@Testpublic void startProcessInstance() {// 流程定義的keyString processDefinitionKey = "processVariables";ProcessInstance pi = processEngine.getRuntimeService()// 與正在執行的流程實例和執行對象相關的Service.startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啟動流程實例,key對應helloworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動System.out.println("流程實例ID:" + pi.getId());// 流程實例IDSystem.out.println("流程定義ID:" + pi.getProcessDefinitionId());// 流程定義ID}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

三、設置流程變量

/** 設置流程變量 */@Testpublic void setVariables() {/** 與任務(正在執行) */TaskService taskService = processEngine.getTaskService();// 任務IDString taskId = "2104";/** 一:設置流程變量,使用基本數據類型 */// taskService.setVariableLocal(taskId, "請假天數", 5);//與任務ID綁定// taskService.setVariable(taskId, "請假日期", new Date());// taskService.setVariable(taskId, "請假原因", "回家探親,一起吃個飯");/** 二:設置流程變量,使用javabean類型 *//*** 當一個javabean(實現序列號)放置到流程變量中,要求javabean的屬性不能再發生變化 * 如果發生變化,再獲取的時候,拋出異常* * 解決方案:在Person對象中添加: private static final long serialVersionUID =* 6757393795687480331L; 同時實現Serializable*/Person p = new Person();p.setId(20);p.setName("翠花");taskService.setVariable(taskId, "人員信息(添加固定版本)", p);System.out.println("設置流程變量成功!");}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

說明:

  1. 流程變量的作用域就是流程實例,所以只要設置就行了,不用管在哪個階段設置
  2. 基本類型設置流程變量,在taskService中使用任務ID,定義流程變量的名稱,設置流程變量的值。
  3. Javabean類型設置流程變量,需要這個javabean實現了Serializable接口
  4. 設置流程變量的時候,向act_ru_variable這個表添加數據

四、獲取流程變量

/** 獲取流程變量 */@Testpublic void getVariables() {/** 與任務(正在執行) */TaskService taskService = processEngine.getTaskService();// 任務IDString taskId = "2104";/** 一:獲取流程變量,使用基本數據類型 */// Integer days = (Integer) taskService.getVariable(taskId, "請假天數");// Date date = (Date) taskService.getVariable(taskId, "請假日期");// String resean = (String) taskService.getVariable(taskId, "請假原因");// System.out.println("請假天數:"+days);// System.out.println("請假日期:"+date);// System.out.println("請假原因:"+resean);/** 二:獲取流程變量,使用javabean類型 */Person p = (Person) taskService.getVariable(taskId, "人員信息(添加固定版本)");System.out.println(p.getId() + "        " + p.getName());}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

說明:

  1. 流程變量的獲取針對流程實例(即1個流程),每個流程實例獲取的流程變量時不同的
  2. 使用基本類型獲取流程變量,在taskService中使用任務ID,流程變量的名稱,獲取流程變量的值。
  3. Javabean類型設置獲取流程變量,除了需要這個javabean實現了Serializable接口外,還要求流程變量對象的屬性不能發生變化,否則拋出異常。解決方案,固定序列化ID

五、模擬流程變量的設置和獲取的場景

/** 模擬設置和獲取流程變量的場景 */public void setAndGetVariables() {/** 與流程實例,執行對象(正在執行) */RuntimeService runtimeService = processEngine.getRuntimeService();/** 與任務(正在執行) */TaskService taskService = processEngine.getTaskService();/** 設置流程變量 */// runtimeService.setVariable(executionId, variableName,// value)//表示使用執行對象ID,和流程變量的名稱,設置流程變量的值(一次只能設置一個值)// runtimeService.setVariables(executionId,// variables)//表示使用執行對象ID,和Map集合設置流程變量,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值(一次設置多個值)// taskService.setVariable(taskId, variableName,// value)//表示使用任務ID,和流程變量的名稱,設置流程變量的值(一次只能設置一個值)// taskService.setVariables(taskId,// variables)//表示使用任務ID,和Map集合設置流程變量,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值(一次設置多個值)// runtimeService.startProcessInstanceByKey(processDefinitionKey,// variables);//啟動流程實例的同時,可以設置流程變量,用Map集合// taskService.complete(taskId, variables)//完成任務的同時,設置流程變量,用Map集合/** 獲取流程變量 */// runtimeService.getVariable(executionId,// variableName);//使用執行對象ID和流程變量的名稱,獲取流程變量的值// runtimeService.getVariables(executionId);//使用執行對象ID,獲取所有的流程變量,將流程變量放置到Map集合中,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值// runtimeService.getVariables(executionId,// variableNames);//使用執行對象ID,獲取流程變量的值,通過設置流程變量的名稱存放到集合中,獲取指定流程變量名稱的流程變量的值,值存放到Map集合中// taskService.getVariable(taskId,// variableName);//使用任務ID和流程變量的名稱,獲取流程變量的值// taskService.getVariables(taskId);//使用任務ID,獲取所有的流程變量,將流程變量放置到Map集合中,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值// taskService.getVariables(taskId,// variableNames);//使用任務ID,獲取流程變量的值,通過設置流程變量的名稱存放到集合中,獲取指定流程變量名稱的流程變量的值,值存放到Map集合中}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

說明:

  1. RuntimeService對象可以設置流程變量和獲取流程變量
  2. TaskService對象可以設置流程變量和獲取流程變量
  3. 流程實例啟動的時候可以設置流程變量
  4. 任務辦理完成的時候可以設置流程變量
  5. 流程變量可以通過名稱/值的形式設置單個流程變量
  6. 流程變量可以通過Map集合,同時設置多個流程變量?
    Map集合的key表示流程變量的名稱?
    Map集合的value表示流程變量的值

六、查詢歷史的流程變量

/** 查詢流程變量的歷史表 */@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("###############################################");}}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

說明:?
歷史的流程變量查詢,指定流程變量的名稱,查詢act_hi_varinst表(也可以針對,流程實例ID,執行對象ID,任務ID查詢)

七、流程變量的支持的類型

Type name Description
string Value is threaded as a java.lang.String. Raw JSON-text value is used when writing a variable.
integer Value is threaded as a java.lang.Integer. When writing, JSON number value is used as base for conversion, falls back to JSON text.
short Value is threaded as a java.lang.Short. When writing, JSON number value is used as base for conversion, falls back to JSON text.
long Value is threaded as a java.lang.Long. When writing, JSON number value is used as base for conversion, falls back to JSON text.
double Value is threaded as a java.lang.Double. When writing, JSON number value is used as base for conversion, falls back to JSON text.
boolean Value is threaded as a java.lang.Boolean. When writing, JSON boolean value is used for conversion.
date Value is treated as a java.util.Date. When writing, the JSON text will be converted using ISO-8601 date format.
binary Binary variable, treated as an array of bytes. The value attribute is null, the valueUrl contains an URL pointing to the raw binary stream.
serializable Serialized representation of a Serializable Java-object. As with the binary type, the value attribute is null, the valueUrl contains an URL pointing to the raw binary stream. All serializable variables (which are not of any of the above types) will be exposed as a variable of this type.

從圖中可以看出包括了大部分封裝類型和Date、String和實現了Serializable接口的類的類型。

八、總結

  1. 流程變量?
    在流程執行或者任務執行的過程中,用于設置和獲取變量,使用流程變量在流程傳遞的過程中傳遞業務參數。?
    對應的表:?
    act_ru_variable:正在執行的流程變量表?
    act_hi_varinst:流程變量歷史表
  2. 擴展知識:setVariable和setVariableLocal的區別?
    setVariable:設置流程變量的時候,流程變量名稱相同的時候,后一次的值替換前一次的值,而且可以看到TASK_ID的字段不會存放任務ID的值?
    setVariableLocal:?
    1:設置流程變量的時候,針對當前活動的節點設置流程變量,如果一個流程中存在2個活動節點,對每個活動節點都設置流程變量,即使流程變量的名稱相同,后一次的版本的值也不會替換前一次版本的值,它會使用不同的任務ID作為標識,存放2個流程變量值,而且可以看到TASK_ID的字段會存放任務ID的值?
    例如act_hi_varinst 表的數據:不同的任務節點,即使流程變量名稱相同,存放的值也是不同的。?
    如圖:?
    ?
    2:還有,使用setVariableLocal說明流程變量綁定了當前的任務,當流程繼續執行時,下個任務獲取不到這個流程變量(因為正在執行的流程變量中沒有這個數據),所有查詢正在執行的任務時不能查詢到我們需要的數據,此時需要查詢歷史的流程變量。

    源碼demo下載:http://download.csdn.net/detail/xunzaosiyecao/9622475

總結

以上是生活随笔為你收集整理的Activiti——流程变量(六)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。