Activiti流程引擎及服务5-历史管理服务HistorySe
2019-08-23 本文已影响0人
安安汐而
Demo项目代码:
https://gitee.com/AnAnXiEr/activiti6-demo
管理流程实例结束后的历史数据
构建历史数据的查询对象
根据流程实例Id删除流程历史数据
HistoryService历史数据实体
- HistoricProcessInstance:历史流程实例实体类
- HistoricVariableInstance:流程或任务变量值的实体
- HistoricActivityInstance:单个活动节点执行的信息
- HistoricTaskInstance:用户任务实例的信息
- HistoricDetail:历史流程活动任务详细信息
HistoryService构建历史查询对象
- create[历史数据实体]Query
- createNative[历史数据实体]Query
- createProcessInstanceHistoryLogQuery(包含流程实例的所有数据、task,评论等)
HistoryService删除历史查询对象
- deleteHistoricProcessInstance(删除流程实例的所有信息)
- deleteHistoricTaskInstance(删除task信息和对应task变量信息)
代码
HistoryServiceTest
package com.imooc.activiti.activitidemo.coreapi;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Maps;
import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.form.FormProperty;
import org.activiti.engine.form.StartFormData;
import org.activiti.engine.form.TaskFormData;
import org.activiti.engine.history.*;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceBuilder;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.ActivitiRule;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.junit.Rule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
/**
* @Description 历史服务测试
* @Author 胡浩
* @Date 2019/8/22
**/
public class HistoryServiceTest {
private static final Logger LOGGER = LoggerFactory.getLogger(HistoryServiceTest.class);
@Rule
public ActivitiRule activitiRule = new ActivitiRule("coreapi/activiti_history.cfg.xml");
/**
*
*/
@Test
@org.activiti.engine.test.Deployment(resources = "coreapi/my-process.bpmn20.xml")
public void testHistoryService() {
HistoryService historyService = activitiRule.getHistoryService();
//通过构造器启动
ProcessInstanceBuilder processInstanceBuilder = activitiRule.getRuntimeService().createProcessInstanceBuilder();
//持久变量
Map<String, Object> variables = Maps.newHashMap();
variables.put("key0", "value0");
variables.put("key1", "value1");
variables.put("key2", "value2");
//瞬时变量
Map<String, Object> transientVariables = Maps.newHashMap();
transientVariables.put("tkey0", "tvalue0");
transientVariables.put("tkey1", "tvalue1");
ProcessInstance processInstance = processInstanceBuilder.processDefinitionKey("my-process")
.processDefinitionKey("my-process")
.variables(variables)//持久变量
.transientVariables(transientVariables)//瞬时变量
.start();
//修改变量
activitiRule.getRuntimeService().setVariable(processInstance.getId(), "key1", "value1_1");
//获取任务
Task task = activitiRule.getTaskService().createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
//提交完成
// activitiRule.getTaskService().complete(task.getId());
Map<String, String> properties = Maps.newHashMap();
properties.put("fKey1", "fValue1");
properties.put("key1", "value_2_2");
//使用提交表单的形式提交
activitiRule.getFormService().submitTaskFormData(task.getId(), properties);
//查询流程实例对象
List<HistoricProcessInstance> historicProcessInstances = historyService.createHistoricProcessInstanceQuery().listPage(0, 100);
for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) {
LOGGER.info("historicProcessInstance = {}", ToStringBuilder.reflectionToString(historicProcessInstance, ToStringStyle.JSON_STYLE));
}
//查询流程执行节点对象
List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery().listPage(0, 100);
for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
LOGGER.info("historicActivityInstance = {}", historicActivityInstance);
}
//查询流程Task对象
List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery().listPage(0, 100);
for (HistoricTaskInstance historicTaskInstance : historicTaskInstances) {
LOGGER.info("historicTaskInstance = {}", ToStringBuilder.reflectionToString(historicTaskInstance, ToStringStyle.JSON_STYLE));
}
//查询流程变量
List<HistoricVariableInstance> historicVariableInstances = historyService.createHistoricVariableInstanceQuery().listPage(0, 100);
for (HistoricVariableInstance historicVariableInstance : historicVariableInstances) {
LOGGER.info("historicVariableInstance = {}", historicVariableInstance);
}
//查询流程Details
List<HistoricDetail> historicDetails = historyService.createHistoricDetailQuery().listPage(0, 100);
for (HistoricDetail historicDetail : historicDetails) {
LOGGER.info("historicDetail = {}", historicDetail);
}
//流程对象的唯一记录、并把历史记录以日志形式输出
ProcessInstanceHistoryLog processInstanceHistoryLog = historyService.createProcessInstanceHistoryLogQuery(processInstance.getId())
.includeVariables().includeFormProperties().includeComments().includeTasks()
.includeActivities().includeVariableUpdates().singleResult();
List<HistoricData> historicData = processInstanceHistoryLog.getHistoricData();
for (HistoricData historicDatum : historicData) {
LOGGER.info("historicDatum = {}", historicDatum);
}
//删除
historyService.deleteHistoricProcessInstance(processInstance.getId());
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().singleResult();
LOGGER.info("historicProcessInstance = {}", historicProcessInstance);//应该为null、已经删了
}
}
activiti_history.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration"
id="processEngineConfiguration">
<property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000;MVCC=TRUE" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="sa" />
<property name="jdbcPassword" value="" />
<!--history配置 默认audit-->
<!--<property name="history" value="none" />-->
<!--<property name="history" value="activity"/>-->
<!--<property name="history" value="audit" />-->
<!--设置成full,方便看整个流程-->
<property name="history" value="full" />
<property name="databaseSchemaUpdate" value="create-drop"/>
<!--mdc拦截-->
<property name="commandInvoker" ref="mdcCommandInvoker"/>
<!--eventLog配置-->
<property name="enableDatabaseEventLogging" value="true"/>
</bean>
<bean class="com.imooc.activiti.activitidemo.interceptor.MDCCommandInvoker" id="mdcCommandInvoker"/>
</beans>