【Activiti工作流】6.Activiti入門程式HelloWorld演示流程的執行(下)
阿新 • • 發佈:2019-01-09
上一次我們在配置好Activiti的開發環境之後,進行了以下開發:
1.繪製流程圖
2.編寫流程引擎載入類
3.通過流程引擎獲取RepositoryService,載入bpmn檔案進行部署。
我們在上篇中看到,當我們成功部署我們的流程物件之後,資料庫中儲存了
我們的一些流程資訊:
我們部署了流程,為的就是使用這個流程方式去處理我們的業務,就如同
之前例子中的請假流程一樣,當用戶填寫了請假申請之後,點選“申請請假”,
就啟動了之前載入bpmn和png檔案所部署的流程物件:
回顧之前我們編寫的流程類:
我們通過getDefaultProcessEngine自載入activiti.cfg.xml檔案,獲得流程引擎
的配置物件,然後通過配置物件獲取流程引擎物件ProcessEngine,然後通過流程
引擎物件獲取部署相關的Service物件,進而載入我們剛剛編寫的流程圖檔案,進行
了流程例項的部署。
接下來我們就要將我們部署的流程例項進行啟動:
我們可以看到流程定義ID為HelloWorld:1:4,與資料庫act_re_procdef表中的ID欄位吻合:
然後我們的例項ID實際上就是我們在程式碼中執行的例項所建立的ID,此ID會在
資料庫中自動生成(預設從101開始),由Ru組表來儲存例項資訊:
流程一旦啟動了,我們的流程相當於提交成功了,根據我們的流程圖:
那麼第一個看到流程任務的就是我們的“張三”同學。所以張三同學就會
擁有一個新的“個人任務”,所以我們接下來就要“查詢當前的個人任務”:
執行結果:
其實這一步和我們之前例子程式裡面的點選“任務管理”觸發的查詢是一樣的:
理所當然我們下一步就是點選“辦理任務”,將這個任務辦理,對於張三來說,就是將
自己的請假申請給提交到上級審批:
我們在測試類中實現辦理任務的核心程式碼:
執行結果:
注意,完成任務之後,該流程的辦理人員就不能再查到任務的相關資訊了:
此時我們的張三的任務已經完成,流程就會走到下一級,也就是李四的任務列表中了:
流程具體結束時間:
1.繪製流程圖
2.編寫流程引擎載入類
3.通過流程引擎獲取RepositoryService,載入bpmn檔案進行部署。
我們在上篇中看到,當我們成功部署我們的流程物件之後,資料庫中儲存了
我們的一些流程資訊:
我們部署了流程,為的就是使用這個流程方式去處理我們的業務,就如同
之前例子中的請假流程一樣,當用戶填寫了請假申請之後,點選“申請請假”,
就啟動了之前載入bpmn和png檔案所部署的流程物件:
回顧之前我們編寫的流程類:
package cn.com.helloworld; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.DeploymentBuilder; import org.junit.Test; public class HelloWorld { //獲取流程引擎物件 //getDefaultProcessEngine方法內部會自動讀取名為activiti.cfg.xml檔案的配置資訊 ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); /**部署流程定義*/ @Test public void deploymentProcessDefinition(){ //與流程定義和部署物件相關的Service RepositoryService repositoryService=processEngine.getRepositoryService(); DeploymentBuilder deploymentBuilder=repositoryService.createDeployment();//建立一個部署物件 deploymentBuilder.name("helloWorld入門程式");//新增部署的名稱 deploymentBuilder.addClasspathResource("diagrams/MyProcess.bpmn");//從classpath的資源載入,一次只能載入一個檔案 deploymentBuilder.addClasspathResource("diagrams/MyProcess.png");//從classpath的資源載入,一次只能載入一個檔案 Deployment deployment=deploymentBuilder.deploy();//完成部署 //列印我們的流程資訊 System.out.println("流程Id:"+deployment.getId()); System.out.println("流程Name:"+deployment.getName()); } }
我們通過getDefaultProcessEngine自載入activiti.cfg.xml檔案,獲得流程引擎
的配置物件,然後通過配置物件獲取流程引擎物件ProcessEngine,然後通過流程
引擎物件獲取部署相關的Service物件,進而載入我們剛剛編寫的流程圖檔案,進行
了流程例項的部署。
接下來我們就要將我們部署的流程例項進行啟動:
執行之後結果:/**啟動流程引擎*/ @Test public void startProcessInstance(){ //獲取流程啟動Service RuntimeService runtimeService=processEngine.getRuntimeService(); //使用流程定義的key,key對應bpmn檔案對應的id, //(也是act_re_procdef表中對應的KEY_欄位),預設是按照最新版本啟動 String processDefinitionkey="HelloWorld";//流程定義的key就是HelloWorld //獲取流程例項物件 ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(processDefinitionkey); System.out.println("流程例項ID:"+processInstance.getId());//流程例項ID System.out.println("流程定義ID:"+processInstance.getProcessDefinitionId());//流程定義ID }
我們可以看到流程定義ID為HelloWorld:1:4,與資料庫act_re_procdef表中的ID欄位吻合:
然後我們的例項ID實際上就是我們在程式碼中執行的例項所建立的ID,此ID會在
資料庫中自動生成(預設從101開始),由Ru組表來儲存例項資訊:
可以看到,啟動流程就相當於提交了申請,我們的申請人就是張三同學。
流程一旦啟動了,我們的流程相當於提交成功了,根據我們的流程圖:
那麼第一個看到流程任務的就是我們的“張三”同學。所以張三同學就會
擁有一個新的“個人任務”,所以我們接下來就要“查詢當前的個人任務”:
/**查詢當前的個人任務(實際就是查詢act_ru_task表)*/ @Test public void findMyPersonalTask(){ String assignee="張三"; //獲取事務Service TaskService taskService=processEngine.getTaskService(); List<Task> taskList=taskService.createTaskQuery()//建立任務查詢物件 .taskAssignee(assignee)//指定個人任務查詢,指定辦理人 .list();//獲取該辦理人下的事務列表 if(taskList!=null&&taskList.size()>0){ for(Task task:taskList){ System.out.println("任務ID:"+task.getId()); System.out.println("任務名稱:"+task.getName()); System.out.println("任務的建立時間:"+task.getCreateTime()); System.out.println("任務辦理人:"+task.getAssignee()); System.out.println("流程例項ID:"+task.getProcessInstanceId()); System.out.println("執行物件ID:"+task.getExecutionId()); System.out.println("流程定義ID:"+task.getProcessDefinitionId()); System.out.println("#############################################"); } } }
執行結果:
其實這一步和我們之前例子程式裡面的點選“任務管理”觸發的查詢是一樣的:
理所當然我們下一步就是點選“辦理任務”,將這個任務辦理,對於張三來說,就是將
自己的請假申請給提交到上級審批:
我們在測試類中實現辦理任務的核心程式碼:
/**完成我的任務*/
@Test
public void completeMyPersonalTask(){
String taskId="304";//上一次我們查詢的任務ID就是304
TaskService taskService=processEngine.getTaskService();
taskService.complete(taskId);//完成taskId對應的任務
System.out.println("完成ID為"+taskId+"的任務");
}
執行結果:
注意,完成任務之後,該流程的辦理人員就不能再查到任務的相關資訊了:
此時我們的張三的任務已經完成,流程就會走到下一級,也就是李四的任務列表中了:
流程具體結束時間:
以上就是我們Activiti的入門工程Helloworld的講解。