1. 程式人生 > >Activiti流程執行歷史資料查詢

Activiti流程執行歷史資料查詢

程式碼:

HistoryQueryTest.java

package com.ytdx.historyQuery;

import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricVariableInstance;
import org.junit.Test;

/**
 * 流程歷史資料查詢
 * @author lhy
 *
 */
public class HistoryQueryTest {

	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**
	 * 1.查詢歷史流程例項(act_hi_procinst表)
	 */
	@Test
	public void findHistoryProcessInstance(){
		String processInstanceId = "1601";
		HistoricProcessInstance hpi = processEngine.getHistoryService()                    //與歷史資料(歷史表)相關的Service
				.createHistoricProcessInstanceQuery()                                      //建立歷史流程例項查詢
				.processInstanceId(processInstanceId)                                      //使用流程例項ID查詢
				.orderByProcessInstanceStartTime().asc()
				.singleResult();
		System.out.println(hpi.getId()+"    "+hpi.getProcessDefinitionId()+"    "+hpi.getStartTime()+"    "+hpi.getEndTime()+"     "+hpi.getDurationInMillis());
	}
	
	/**
	 * 2.查詢歷史活動(act_hi_actinst表)
	 */
	@Test
	public void findHistoryActiviti(){
		String processInstanceId = "1601";
		List<HistoricActivityInstance> list = processEngine.getHistoryService()
				.createHistoricActivityInstanceQuery()                                      //建立歷史活動例項的查詢
				.processInstanceId(processInstanceId)
				.orderByHistoricActivityInstanceStartTime().asc()
				.list();
		if(list !=null && list.size()>0){
			for(HistoricActivityInstance hai : list){
				System.out.println(hai.getId()+"   "+hai.getProcessInstanceId()+"   "+hai.getActivityType()+"  "+hai.getStartTime()+"   "+hai.getEndTime()+"   "+hai.getDurationInMillis());
				System.out.println("#####################");
			}
		}
	}
	
	/**
	 * 3.查詢歷史任務(act_hi_taskinst表)
	 */
	@Test
	public void findHistoryTask(){
		String processInstanceId = "1601";
		List<HistoricTaskInstance> list = processEngine.getHistoryService()                 //與歷史資料(歷史表)相關的Service
				.createHistoricTaskInstanceQuery()                                          //建立歷史任務例項查詢
				.processInstanceId(processInstanceId)
				.orderByHistoricTaskInstanceStartTime().asc()
				.list();
		if(list !=null && list.size()>0){
			for(HistoricTaskInstance hti:list){
				System.out.println(hti.getId()+"    "+hti.getName()+"    "+hti.getProcessInstanceId()+"   "+hti.getStartTime()+"   "+hti.getEndTime()+"   "+hti.getDurationInMillis());
				System.out.println("################################");
			}
		}
	}
	
	/**
	 * 4.查詢歷史流程變數(act_hi_varinst表)
	 */
	@Test
	public void findHistoryProcessVariables(){
		String processInstanceId = "1601";
		List<HistoricVariableInstance> list = processEngine.getHistoryService()
				.createHistoricVariableInstanceQuery()                                      //建立一個歷史的流程變數查詢物件
				.processInstanceId(processInstanceId)
				.list();
		if(list !=null && list.size()>0){
			for(HistoricVariableInstance hvi:list){
				System.out.println(hvi.getId()+"   "+hvi.getProcessInstanceId()+"   "+hvi.getVariableName()+"   "+hvi.getVariableTypeName()+"    "+hvi.getValue());
				System.out.println("###############################################");
			}
		}
	}
}

總結:

      由於資料庫中儲存著歷史資訊以及正在執行的流程例項資訊,在實際專案中對已完成任務的檢視頻率遠不及對代辦和可接任務的檢視,所以在activiti採用分開管理,把正在執行的交給RuntimeServiceTaskService管理,而歷史資料交給HistoryService來管理。

       這樣做的好處在於,加快流程執行的速度,因為正在執行的流程的表中資料不會很大。