上一次我們在配置好Activiti的開發環境之後,進行了以下開發:
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+"的任務");
}
運作結果:
注意,完成任務之後,該流程的辦理人員就不能再查到任務的相關資訊了:
此時我們的張三的任務已經完成,流程就會走到下一級,也就是李四的任務清單中了:
同理,當李四審批完畢之後,任務完成,流程就會走到王五那裡:
王五審批完畢後,走到結束節點,整個流程結束。我們檢視act_hi_procinst表可以看到
流程具體結束時間:
以上就是我們Activiti的入門工程Helloworld的講解。
轉載請注明出處:http://blog.csdn.net/acmman/article/details/60466278