程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> (2)java順序走一遍任務流activiti

(2)java順序走一遍任務流activiti

編輯:關於JAVA

(2)java順序走一遍任務流activiti。本站提示廣大學習愛好者:((2)java順序走一遍任務流activiti)文章只能為提供參考,不一定能成為您想要的結果。以下是(2)java順序走一遍任務流activiti正文


  
  
任務流從流程定義到創立一個流程實例完成執行步驟
  1. 運用activi-designer創立一個流程定義(.bpmn開頭的文件)
  2. 將定義好的流程定義和生成的png圖片經過RepositoryService(後面章節說過次要是用來處置流程定義的service)的api上傳到數據庫
  3. 經過RuntimeService(這個service次要是處置以後正在運轉的流程實例的)啟動一個流程實例
  4. 這個時分經過TaskService(次要處置以後運轉的義務,一個流程實例下有多個義務)獲取到下面的實例所對應的以後人義務
  5. 完畢下面的義務task,流程實例會走向下一個task義務
  6. 反復4,5,完成一個流程實例的啟動到完畢

  下面就是一個最復雜從上往下執行的流程的執行步驟,本章節都是以代碼做示例,代碼不多,但是都執行一遍,你會對整個activiti的流程有個大約的理解

  

  1,首先第一步要做的就是經過eclipse插件activiti-designer繪制一張最復雜的流程圖出來(在這裡我們只用到了startEvent,endEvent,UserTask三個組件所以是比擬復雜的)

  

  

  繪制的流程圖如下

  

  當我們點擊創立推銷單的時分,為這個節點定義一個id和稱號(上面幾個節點也是異樣的道理)

  


 

  

  

  點擊左側的mainConfig在Assingee輸出一個名字,設置該流程這個步驟的處置人(當然在實踐順序中會采用另外的靜態獲取的方式,這樣只是方便了解一個全體進程)

  接上去異樣的道理順次為每個節點設置處置人

  


 

 

  最後點擊空白處,設置整個流程的id和稱號

  

   到這裡點擊保管後,會在相反的目錄下生成purchasingflow.png,到這裡復雜的流程就繪制完成了

 

  2,應用activiti的api將下面定義好的任務流bpmn文件和png文件上傳到activiti的數據庫

 1 /*
 2      * 獲取流程引擎對象,上面的辦法會默許查找classpath目錄下的稱號為activi.cfg.xml
 3      * 外面bean的id為processEngineConfiguration的ProcessEngineConfiguration引擎配置對象來獲取ProcessEngine對象
 4     */    
 5     private ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
 6     
 7     //部署一個流程
 8     @Test
 9     public void deployProcessDefinition(){
10         //依據引擎獲取資源service
11         RepositoryService repositoryService =   engine.getRepositoryService();
12         //部署bpmn文件
13         String bpmnName="purchasingflow.bpmn";
14         InputStream bpmnIn = this.getClass().getClassLoader().getResourceAsStream("diagram/purchasingflow.bpmn");
15         //部署bpmn生成的圖片
16         String pngName="purchasingflow.png";
17         InputStream pngIn = this.getClass().getClassLoader().getResourceAsStream("diagram/purchasingflow.png");
18         //添加這兩個文件停止部署
19         Deployment deployment = repositoryService.createDeployment()
20             .addInputStream(bpmnName, bpmnIn)
21             .addInputStream(pngName, pngIn)
22             .deploy();
23         
24         System.out.println("部署id:"+deployment.getId());
25         System.out.println("部署的name:"+deployment.getDeploymentTime());
26         
27     }

  下面的復雜的api就將推銷流程的流程定義部署到我們的activiti的數據庫,翻開數據庫act_re_procdef可以查詢到我們方才上傳的流程定義

  

  3,在啟動一個流程實例之前我們再反復上傳下面的流程定義,接著我們依據流程定義的id(purchasingflow)來查詢這個流程定義看看會發作什麼狀況 

 1 //查詢流程定義
 2     @Test
 3     public void queryProcessDefinition(){
 4         
 5         RepositoryService repositoryService =   engine.getRepositoryService();
 6         //創立流程定義查詢對象
 7         ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
 8         
 9         String processDefinitionKey = "purchasingflow";
10         //設置流程定義的key的查詢條件
11         definitionQuery.processDefinitionKey(processDefinitionKey);
12         //查詢一切的流程定義
13         List<ProcessDefinition> processDefinitionList = definitionQuery.list();
14         for(ProcessDefinition definition:processDefinitionList){
15             System.out.println("-------------------------");
16             System.out.println("流程定義id:"+definition.getId());
17             System.out.println("流程資源名:"+definition.getResourceName());
18             System.out.println("流程部署id:"+definition.getDeploymentId());
19         }
20         
21     
22     }

  下面的後果輸入了三條流程定義,並且部署的id不同和流程定義的id都不相反,帶著這個疑問,我們在上面啟動一個流程實例並詳細解說下

  

  4,啟動一個流程實例

 1 //啟動一個流程實例
 2     @Test
 3     public void startProcessInstance(){
 4         
 5         RuntimeService runtimeService = engine.getRuntimeService();
 6         
 7         String processDefinitionKey = "purchasingflow";
 8         //依據流程定義的key啟動一個流程實例
 9         ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
10         System.out.println("流程實例id:"+processInstance.getId());
11         System.out.println("流程定義id:"+processInstance.getProcessDefinitionId());
12         
13         
14     }

  我們發現下面打印的流程定義的id是我們最後一次上傳的流程定義,所以我們得出結論,屢次上傳相反id的流程定義,依據流程定義啟動流程實例,會取版本最新的流程定義

  

   5,查詢以後處置人的義務,我們之前在流程定義的時分寫死第一個節點(也就是創立推銷單這一步的處置人是zhangsan)

 1 //查詢以後用戶的代辦義務
 2     @Test
 3     public void queryProcessInstance(){
 4         
 5         //查詢義務運用的service
 6         TaskService taskService = engine.getTaskService();
 7         //獲取義務查詢對象
 8         TaskQuery taskQuery = taskService.createTaskQuery();
 9         taskQuery.taskAssignee("zhangsan");
10         //查詢該條件下的一切的義務
11         List<Task> tasks =taskQuery.list();
12         for(Task task:tasks){
13             System.out.println("以後義務id:"+task.getId());
14             System.out.println("以後義務所屬流程定義id:"+task.getProcessDefinitionId());
15             System.out.println("以後義務的key:"+task.getTaskDefinitionKey());
16         }
17         
18     }

  我們經過zhangsan查詢到以後義務的id和所屬流程定義id,大家會發現假如填寫的不是zhangsan而是別的就會查詢不到,由於我們指定的義務處置人是zhangsan

  

  6,處置一個義務,到這裡我們的zhangsan獲取到這個義務後,需求處置完它

 1 //完成一個流程
 2     @Test
 3     public void completeProcessInstance(){
 4         
 5         //義務的id,前期整合後會經過以後登錄人身份查詢到該用戶的義務,然後獲取到該id
 6         String taskId="402";
 7         TaskService taskService = engine.getTaskService();
 8         //依據義務id完成該義務
 9         taskService.complete(taskId);
10         
11     }

  

  7,我們在經過lisi,也就是下一節點的處置人查詢以後義務會發現查詢到了一個義務,然後反復5,6,直就任務完畢

  

  

  

  

  

  

  

  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved