天天看點

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

上一次我們在配置好Activiti的開發環境之後,進行了以下開發:

1.繪制流程圖

2.編寫流程引擎加載類

3.通過流程引擎擷取RepositoryService,加載bpmn檔案進行部署。

我們在上篇中看到,當我們成功部署我們的流程對象之後,資料庫中儲存了

我們的一些流程資訊:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)
【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)
【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

我們部署了流程,為的就是使用這個流程方式去處理我們的業務,就如同

之前例子中的請假流程一樣,當使用者填寫了請假申請之後,點選“申請請假”,

就啟動了之前加載bpmn和png檔案所部署的流程對象:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)
【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

回顧之前我們編寫的流程類:

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
}
           

運作之後結果:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

我們可以看到流程定義ID為HelloWorld:1:4,與資料庫act_re_procdef表中的ID字段吻合:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

然後我們的執行個體ID實際上就是我們在代碼中運作的執行個體所建立的ID,此ID會在

資料庫中自動生成(預設從101開始),由Ru組表來存儲執行個體資訊:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)
【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)
【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

可以看到,啟動流程就相當于送出了申請,我們的申請人就是張三同學。

流程一旦啟動了,我們的流程相當于送出成功了,根據我們的流程圖:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

那麼第一個看到流程任務的就是我們的“張三”同學。是以張三同學就會

擁有一個新的“個人任務”,是以我們接下來就要“查詢目前的個人任務”:

/**查詢目前的個人任務(實際就是查詢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("#############################################");
		}
	}
}
           

運作結果:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

其實這一步和我們之前例子程式裡面的點選“任務管理”觸發的查詢是一樣的:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

理所當然我們下一步就是點選“辦理任務”,将這個任務辦理,對于張三來說,就是将

自己的請假申請給送出到上級審批:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

我們在測試類中實作辦理任務的核心代碼:

/**完成我的任務*/
@Test
public void completeMyPersonalTask(){
	String taskId="304";//上一次我們查詢的任務ID就是304
	TaskService taskService=processEngine.getTaskService();
	taskService.complete(taskId);//完成taskId對應的任務
	System.out.println("完成ID為"+taskId+"的任務");
	
}
           

運作結果:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

注意,完成任務之後,該流程的辦理人員就不能再查到任務的相關資訊了:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

此時我們的張三的任務已經完成,流程就會走到下一級,也就是李四的任務清單中了:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)
【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)
【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

同理,當李四審批完畢之後,任務完成,流程就會走到王五那裡:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)
【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)
【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

王五審批完畢後,走到結束節點,整個流程結束。我們檢視act_hi_procinst表可以看到

流程具體結束時間:

【Activiti工作流】6.Activiti入門程式HelloWorld示範流程的執行(下)

以上就是我們Activiti的入門工程Helloworld的講解。

轉載請注明出處:http://blog.csdn.net/acmman/article/details/60466278