(2)java程序走一遍工做流activiti

  
  工做流從流程定義到建立一個流程實例完成執行步驟
  1. 使用activi-designer建立一個流程定義(.bpmn結尾的文件)
  2. 將定義好的流程定義和生成的png圖片經過RepositoryService(前面章節說過主要是用來處理流程定義的service)的api上傳到數據庫
  3. 經過RuntimeService(這個service主要是處理當前正在運行的流程實例的)啓動一個流程實例
  4. 這個時候經過TaskService(主要處理當前運行的任務,一個流程實例下有多個任務)獲取到上面的實例所對應的當前人任務
  5. 結束上面的任務task,流程實例會走向下一個task任務
  6. 重複4,5,完成一個流程實例的啓動到結束

  上面就是一個最簡單從上往下執行的流程的執行步驟,本章節都是以代碼作示例,代碼很少,可是都執行一遍,你會對整個activiti的流程有個大概的瞭解web

  

  1,首先第一步要作的就是經過eclipse插件activiti-designer繪製一張最簡單的流程圖出來(在這裏咱們只用到了startEvent,endEvent,UserTask三個組件因此是比較簡單的)數據庫

  

  

  繪製的流程圖以下api

  

  當咱們點擊建立採購單的時候,爲這個節點定義一個id和名稱(下面幾個節點也是一樣的道理)eclipse

  


 

  

  

  點擊左側的mainConfig在Assingee輸入一個名字,設置該流程這個步驟的處理人(固然在實際程序中會採用另外的動態獲取的方式,這樣只是方便理解一個總體過程)this

  接下來一樣的道理依次爲每一個節點設置處理人spa

  


 

 

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

  

   到這裏點擊保存後,會在相同的目錄下生成purchasingflow.png,到這裏簡單的流程就繪製完成了3d

 

  2,利用activiti的api將上面定義好的工做流bpmn文件和png文件上傳到activiti的數據庫code

 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能夠查詢到咱們剛纔上傳的流程定義orm

  

  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,直到任務結束

相關文章
相關標籤/搜索