Activiti入门教程十(详解历史服务组件HistoryService)


     Activiti在删除流程定义、删除任务和删除流程实例时,均会将删除的数据保存到历史数据中,初次外,已经完成的流程实例以及相关数据,都会保持到历史数据中,如果要对这些数据进行管理的话,就需要用到HistoryService组件了。


     正如上面所说,Activiti在整个流程执行过程中,会把所有相关的信息,都想历史表中保存,因此HistoryService该组件的查询方法特别的丰富,下面小编带大家来见识一下吧!


     历史流程实例查询 

     使用HistoryService的createHistoricProcessInstanceQuery()方法就可以得到HistoricProcessInstanceQuery对象,该对象主要用于流程实例的历史数据查询。对于流程实例,不管流程是否完成,都会保存到ACT_HI_PROCINST表中。

<span style="font-family:Comic Sans MS;font-size:18px;">public class ProcessInstanceQuery {

	public static void main(String[] args) throws Exception {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务实例
		RepositoryService repositoryService = engine.getRepositoryService();
		// 得到运行时服务组件
		RuntimeService runtimeService = engine.getRuntimeService();
		// 得到历史服务组件
		HistoryService historyService = engine.getHistoryService();
		// 部署流程文件
		Deployment deploy = repositoryService.createDeployment()
				.addClasspathResource("bpmn/ProcessInstanceQuery.bpmn").deploy();
		// 查询流程定义 
				ProcessDefinition define = repositoryService
						.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
				// 开始流程
				ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess", "businessKey1");
				ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess", "businessKey2");
				// 查询执行流
				Execution exe1 = runtimeService.createExecutionQuery()
						.processInstanceId(pi1.getId()).singleResult();
				Execution exe2 = runtimeService.createExecutionQuery()
						.processInstanceId(pi2.getId()).singleResult();
				// 完成第一条流程
				runtimeService.signal(exe1.getId());
				exe1 = runtimeService.createExecutionQuery()
						.processInstanceId(pi1.getId()).singleResult();
				runtimeService.signal(exe1.getId());
				// 查询已完成的流程
				List<HistoricProcessInstance> datas = historyService
						.createHistoricProcessInstanceQuery().finished().list();
				System.out.println("使用finished方法:" + datas.size());
				// 根据流程定义ID查询
				datas = historyService.createHistoricProcessInstanceQuery()
						.processDefinitionId(define.getId()).list();
				System.out.println("使用processDefinitionId方法: " + datas.size());
				// 根据流程定义key(流程描述文件的process节点id属性)查询
				datas = historyService.createHistoricProcessInstanceQuery()
						.processDefinitionKey(define.getKey()).list();
				System.out.println("使用processDefinitionKey方法: " + datas.size());
				// 根据业务主键查询
				datas = historyService.createHistoricProcessInstanceQuery()
						.processInstanceBusinessKey("businessKey1").list();
				System.out.println("使用processInstanceBusinessKey方法: " + datas.size());
				// 根据流程实例ID查询
				datas = historyService.createHistoricProcessInstanceQuery()
						.processInstanceId(pi1.getId()).list();
				System.out.println("使用processInstanceId方法: " + datas.size());
				// 查询没有完成的流程实例
				historyService.createHistoricProcessInstanceQuery().unfinished().list();
				System.out.println("使用unfinished方法: " + datas.size());
	}
}
</span>



     历史任务查询

     通过HistoryService的createHistoricTaskInstanceQuery()方法,就可以得到HistoricTaskInstanceQuery对象,主要用来根据查询条件,到历史任务表ACT_HI_TASKINST中查询符合条件的数据。

<span style="font-family:Comic Sans MS;font-size:18px;">public class TaskQuery {

	public static void main(String[] args) throws Exception {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务实例
		RepositoryService repositoryService = engine.getRepositoryService();
		// 得到运行时服务组件
		RuntimeService runtimeService = engine.getRuntimeService();
		// 得到历史服务组件
		HistoryService historyService = engine.getHistoryService();
		// 得到任务组件
		TaskService taskService = engine.getTaskService();
		// 部署流程文件
		Deployment deploy = repositoryService.createDeployment()
				.addClasspathResource("bpmn/TaskQuery.bpmn").deploy();
		ProcessDefinition define = repositoryService.createProcessDefinitionQuery()
				.deploymentId(deploy.getId()).singleResult();
		// 初始化参数
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Map<String, Object> vars = new HashMap<String, Object>();
		vars.put("varDate1", sdf.parseObject("2020-10-10 06:00:00"));
		vars.put("varDate2", sdf.parseObject("2021-10-10 06:00:00"));
		//开始流程
		ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess", 
				"businessKey1", vars);
		ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess", 
				"businessKey2", vars);
		//完成流程1
		Execution exe1 = runtimeService.createExecutionQuery().processInstanceId(pi1.getId())
				.singleResult();
		runtimeService.signal(exe1.getId());
		exe1 = runtimeService.createExecutionQuery().processInstanceId(pi1.getId())
				.singleResult();
		runtimeService.signal(exe1.getId());
		// 流程2完成一个任务
		List<Task> tasks = taskService.createTaskQuery().processInstanceId(pi2.getId()).list();
		for (Task task : tasks) {
			taskService.complete(task.getId());
		}
		//历史数据查询
		List<HistoricTaskInstance> datas = historyService.createHistoricTaskInstanceQuery()
				.finished().list();
		System.out.println("使用finished方法查询:" + datas.size());//结果3
		datas = historyService.createHistoricTaskInstanceQuery()
				.processDefinitionId(define.getId()).list();
		System.out.println("使用processDefinitionId方法查询:" + datas.size());//结果4
		datas = historyService.createHistoricTaskInstanceQuery()
				.processDefinitionKey("testProcess").list();
		System.out.println("使用processDefinitionKey方法查询:" + datas.size());//结果4
		datas = historyService.createHistoricTaskInstanceQuery()
				.processDefinitionName("testProcess2").list();
		System.out.println("使用processDefinitionName方法查询:" + datas.size());//结果4
		datas = historyService.createHistoricTaskInstanceQuery()
				.processFinished().list();
		System.out.println("使用processFinished方法查询:" + datas.size());//结果2
		datas = historyService.createHistoricTaskInstanceQuery()
				.processInstanceId(pi2.getId()).list();
		System.out.println("使用processInstanceId方法查询:" + datas.size());//结果2
		datas = historyService.createHistoricTaskInstanceQuery()
				.processUnfinished().list();
		System.out.println("使用processUnfinished方法查询:" + datas.size());//结果2
		datas = historyService.createHistoricTaskInstanceQuery()
				.taskAssignee("crazyit").list();
		System.out.println("使用taskAssignee方法查询:" + datas.size());//结果2
		datas = historyService.createHistoricTaskInstanceQuery()
				.taskAssigneeLike("%zy%").list();
		System.out.println("使用taskAssigneeLike方法查询:" + datas.size());//结果2
		datas = historyService.createHistoricTaskInstanceQuery()
				.taskDefinitionKey("usertask1").list();
		System.out.println("使用taskDefinitionKey方法查询:" + datas.size());//结果2
		datas = historyService.createHistoricTaskInstanceQuery()
				.taskDueAfter(sdf.parse("2020-10-11 06:00:00")).list();
		System.out.println("使用taskDueAfter方法查询:" + datas.size());//结果2
		datas = historyService.createHistoricTaskInstanceQuery()
				.taskDueBefore(sdf.parse("2022-10-11 06:00:00")).list();
		System.out.println("使用taskDueBefore方法查询:" + datas.size());//结果4
		datas = historyService.createHistoricTaskInstanceQuery()
				.taskDueDate(sdf.parse("2020-10-11 06:00:00")).list();
		System.out.println("使用taskDueDate方法查询:" + datas.size());//结果0
		datas = historyService.createHistoricTaskInstanceQuery()
				.unfinished().list();
		System.out.println("使用unfinished方法查询:" + datas.size());//结果1
	}

}</span>





     历史行为查询

     流程在进行过程中,每每走一个节点,都会记录流程节点的信息,包括节点的id,名称、类型、时间等,保存到ACT_HI_ACTINST表中。

<span style="font-family:Comic Sans MS;font-size:18px;">public class ActivityQuery {


	public static void main(String[] args) {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务实例
		RepositoryService repositoryService = engine.getRepositoryService();
		// 得到运行时服务组件
		RuntimeService runtimeService = engine.getRuntimeService();
		// 得到历史服务组件
		HistoryService historyService = engine.getHistoryService();
		// 任务组件
		TaskService taskService = engine.getTaskService();
		// 部署流程文件
		repositoryService.createDeployment()
				.addClasspathResource("bpmn/ActivityQuery.bpmn").deploy();			
		// 开始两条流程
		ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess");
		ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess");
		// 结束第一个流程实例
		Execution exe = runtimeService.createExecutionQuery()
				.processInstanceId(pi1.getId()).singleResult();
		runtimeService.signal(exe.getId());
		runtimeService.signalEventReceived("mySignal");
		// 第二个流程实例完成第一个任务
		Task task = taskService.createTaskQuery().processInstanceId(pi2.getId()).singleResult();
		taskService.complete(task.getId());	
		//查询数据
		List<HistoricActivityInstance> datas = historyService.createHistoricActivityInstanceQuery()
				.activityId("endevent1").list();
		System.out.println("使用activityId查询:" + datas.size());//结果1
		datas = historyService.createHistoricActivityInstanceQuery()
				.activityInstanceId(datas.get(0).getId()).list();
		System.out.println("使用activityInstanceId查询:" + datas.size());//结果1
		datas = historyService.createHistoricActivityInstanceQuery()
				.activityType("intermediateSignalCatch").list();
		System.out.println("使用activityType查询:" + datas.size());//结果2
		datas = historyService.createHistoricActivityInstanceQuery()
				.executionId(exe.getId()).list();
		System.out.println("使用executionId查询:" + datas.size());//结果3
		datas = historyService.createHistoricActivityInstanceQuery().finished().list();
		System.out.println("使用finished查询:" + datas.size());//结果6
		datas = historyService.createHistoricActivityInstanceQuery()
				.processInstanceId(pi2.getId()).list();
		System.out.println("使用processInstanceId查询:" + datas.size());//结果3
		datas = historyService.createHistoricActivityInstanceQuery()
				.taskAssignee("crazyit").list();
		System.out.println("使用taskAssignee查询:" + datas.size());//结果2
		datas = historyService.createHistoricActivityInstanceQuery().unfinished().list();
		System.out.println("使用unfinished查询:" + datas.size());//结果1
	}

}
</span>


历史流程明细查询

在流程进行的过程中,会产生许多明细数据,只有将History设置为最高级别的时候,才会被记录到ACT_HI_DETAIL表中。

<span style="font-family:Comic Sans MS;font-size:18px;">public class DetailQuery {

	public static void main(String[] args) {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务实例
		RepositoryService repositoryService = engine.getRepositoryService();
		// 得到运行时服务组件
		RuntimeService runtimeService = engine.getRuntimeService();
		// 得到历史服务组件
		HistoryService historyService = engine.getHistoryService();
		// 得到任务组件
		TaskService taskService = engine.getTaskService();
		// 部署流程文件
		repositoryService.createDeployment()
			.addClasspathResource("bpmn/DetailQuery.bpmn").deploy();
		// 初始化参数
		Map<String, Object> vars = new HashMap<String, Object>();
		vars.put("days", 10);
		//  开始流程
		ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess", vars);
		ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess", vars);
		// 完成第一个流程 
		Execution exe = runtimeService.createExecutionQuery()
				.processInstanceId(pi1.getId()).singleResult();
		Task task = taskService.createTaskQuery().executionId(exe.getId()).singleResult();
		taskService.complete(task.getId(), vars);
		exe = runtimeService.createExecutionQuery().processInstanceId(pi1.getId()).singleResult();
		runtimeService.signal(exe.getId());
		// 为第二个流程的第一个任务设置参数
		exe = runtimeService.createExecutionQuery().processInstanceId(pi2.getId()).singleResult();
		task = taskService.createTaskQuery().executionId(exe.getId()).singleResult();
		taskService.setVariableLocal(task.getId(), "name", "crazyit");
		// 查询历史行为
		HistoricActivityInstance act = historyService.createHistoricActivityInstanceQuery()
				.activityName("First Task").finished().singleResult();
		List<HistoricDetail> datas = historyService.createHistoricDetailQuery()
				.activityInstanceId(act.getId()).list();
		System.out.println("使用activityInstanceId方法查询:" + datas.size());//结果1
		datas = historyService.createHistoricDetailQuery().excludeTaskDetails().list();
		System.out.println("使用excludeTaskDetails方法查询:" + datas.size());//结果3
		datas = historyService.createHistoricDetailQuery().formProperties().list();
		System.out.println("使用formProperties方法查询:" + datas.size());//结果0
		datas = historyService.createHistoricDetailQuery().processInstanceId(pi1.getId()).list();
		System.out.println("使用processInstanceId方法查询:" + datas.size());//结果2
		datas = historyService.createHistoricDetailQuery().taskId(task.getId()).list();
		System.out.println("使用taskId方法查询:" + datas.size());//结果1
		datas = historyService.createHistoricDetailQuery().variableUpdates().list();
		System.out.println("使用variableUpdates方法查询:" + datas.size());//结果4
	}

}
</span>



评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值