1. 程式人生 > >activiti之流程變量

activiti之流程變量

activiti

所謂的流程變量,大概也就是和咱們業務相關的數據,例如我要請假,那我得知道是誰在請假請假人是誰,也就是我要知道activiti的實體和咱們業務的javaBean如何關聯起來。

下邊我們先看一下和流程變量的數據庫表都有哪些,當然我們自己建的表的不說了,都是流程變量。哈哈。

act_ru_task(正在執行的任務表)和act_hi_taskinst(正在執行的任務表)

主要記錄了正在執行的任務名稱,流程實例ID,流程定義DI,任務的key,和流程變量信息。

技術分享

技術分享

歷史任務表記錄的信息和正在執行的任務表信息都一樣,區別就在於一個是全部的信息,一個事正在執行的任務相關信息。

act_hi_comment

因為是多用於對業務的操作,這個表主要記錄了一些不同用於對同一個事件不同的看法,以方便其他用戶做參考。例如請假,項目經理一說:我的員工老師加班,就得給家,主任也就直接給了。對吧。

技術分享

act_ru_execute(正在執行的實例表)註意business_key,這個字段是我們自定義的,我的方法就是實例 + “.” + "業務ID"

技術分享

act_ru_variable(正在執行的 流程定義表信息)

技術分享

好的,activiti提供的表有流程變量的就是這些表了,既然有了這些表,那麽我們看一下這些表在我們業務實現的時候都是如何來運用的。下邊我通過兩個實例,一個是我在畫流程圖是寫好流程實例,一個是運用javaBean來實現。

簡單實例

部署並啟動流程實例

[java] view plain copy

  1. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

  2. /**部署流程定義從(inputStream)*/

  3. @Test

  4. public void deploymentProcessDefinition_input(){

  5. InputStream inputStreamBpmn = this.getClass().getResourceAsStream("/diagrams/porcessVariables.bpmn");

  6. InputStream inputStreamPng = this.getClass().getResourceAsStream("/diagrams/porcessVariables.png");

  7. Deployment deployment = processEngine.getRepositoryService() //用於流程定義和部署相關對象的Service

  8. .createDeployment() //創建一個部署對象

  9. .name("hellworld部門程序")

  10. .addInputStream("porcessVariables.bpmn", inputStreamBpmn) //使用資源名稱和輸入流(與資源文件的名稱要一直)

  11. .addInputStream("porcessVariables.png", inputStreamPng)

  12. .deploy();

  13. System.out.println("deployment" + deployment.getId()); //1

  14. System.out.println("deployment" + deployment.getName());//部門程序

  15. }

  16. @Test

  17. public void startProcessInstance() {

  18. //流程定義的key

  19. String processInstenceKey = "processVariables";

  20. ProcessInstance pi = processEngine.getRuntimeService() //與正在執行的流程實例和執行對象相關的service

  21. .startProcessInstanceByKey(processInstenceKey); //使用流程定義的key來啟動流程實例helloworld.bpmn的id,使用key啟動,默認用最新的版本啟動

  22. System.out.println("流程實例id:" + pi.getId()); //流程實例id

  23. System.out.println("流程定義id:" + pi.getProcessDefinitionId()); //流程定義ID helloworld:1:4

  24. }

當我們啟動以後是沒有流程變量的,但是接下來我們就要設置了,如果我們在我們話流程圖的時候設置好了的話,例如在單擊bpmn中的某一個任務,選擇Main config,然後在Assign這寫上”張三“,那麽我們就要啟動張三的的業務流程的話,則需要如下代碼來這是:

[java] view plain copy

  1. <pre name="code" class="java">@Test

  2. public void setVariables(){

  3. String taskId = "2004";

  4. TaskService taskService = processEngine.getTaskService();

  5. taskService.setVariableLocal(taskId, "請假天數", 3); //與任務ID綁定

  6. taskService.setVariable(taskId, "請假日期", new Date());

  7. taskService.setVariable(taskId, "請假原因", "回家看親");

  8. System.out.println("設置成功了");

  9. }

而上邊代碼的taskId就是實例啟動以後的當前正在執行的任務ID,然後我們去act_ru_variable,act_ru_task等表中都能看到張三的這個名字,但是這樣是可以實現,但是我們在實際運用中卻都不會這樣用,既然是面向對象,我們就應該這樣。

[java] view plain copy

  1. public class Person implements Serializable {

  2. /**

  3. *

  4. */

  5. private static final long serialVersionUID = 1L;

  6. private Integer id;

  7. private String name;

  8. public String getName() {

  9. return name;

  10. }

  11. public Integer getId() {

  12. return id;

  13. }

  14. public void setId(Integer id) {

  15. this.id = id;

  16. }

  17. public void setName(String name) {

  18. this.name = name;

  19. }

  20. }

[java] view plain copy

  1. @Test

  2. public void setVariables(){

  3. String taskId = "2004";

  4. TaskService taskService = processEngine.getTaskService();

  5. /**使用javaBean*/

  6. Person p = new Person();

  7. p.setId(20);

  8. p.setName("menghaibintest");

  9. taskService.setVariable(taskId, "人員信息", p);

  10. System.out.println("設置成功了");

  11. }


看一下效果顯示

技術分享

那麽我們獲取一下吧

[java] view plain copy

  1. /**

  2. * 獲取流程變量

  3. */

  4. @Test

  5. public void getVariables(){

  6. TaskService taskService = processEngine.getTaskService();

  7. String taskId = "404";

  8. Person p = (Person)taskService.getVariable(taskId, "人員信息");

  9. System.out.println("id:" + p.getId());

  10. System.out.println("name" + p.getName());

  11. }

當然你可能覺得這樣還是不夠友好,我想把我的業務和工作流的表區分開來,只用主外鍵來關聯,那麽下篇博客我來為大家呈現一種耦合性最低的方法。

簡單總結一下就是既然要設置好流程變量,那麽就要知道我們的流程變量在數據庫中表的位置,和在工作流中如何設置。既然是面向對象,我們就不應該再去使用一個一個設置的方式。


activiti之流程變量