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>
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow