Activiti学习之历史记录配置-history
1.工程的主要目录结构
2.给出ConfigHistoryLevelTest部分的源码供参考
package com.imooc.activiti.myconfig;
import com.google.common.collect.Maps;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricDetail;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.logging.LogMDC;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.ActivitiRule;
import org.activiti.engine.test.Deployment;
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 org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public class ConfigHistoryLevelTest {
private static final Logger LOGGER = LoggerFactory
.getLogger(ConfigHistoryLevelTest.class);
@Rule
public ActivitiRule activitiRule = new
ActivitiRule("activiti_historylevel.cfg.xml");
@Test
@Deployment(resources = {"com/imooc/activiti/my-process.bpmn20.xml"})
public void test() {
//启动流程,流程启动完成后向流程中传入一个参数
startProcessInstance();
//修改变量。获取当前执行的对象,遍历并输出
changeVariable();
//提交表单 task。采用submitTaskFormData方式,它的property两个都是string类型
submitTaskFormData();
//输出历史活动
showHistoryActivity();
//输出历史变量
showHistoryVariable();
//输出历史用户任务
showHistoryTask();
//输出历史表单
showHistoryForm();
//输出历史详情
showHistoryDetail();
}
private void showHistoryDetail() {
List<HistoricDetail> historicDetails = activitiRule
.getHistoryService()
.createHistoricDetailQuery().listPage(0, 100);
for(HistoricDetail historicDetail : historicDetails){
LOGGER.info("historicDetail = {}", toString(historicDetail));
}
LOGGER.info("historicDetails.size = {}", historicDetails.size());
}
private void showHistoryForm() {
List<HistoricDetail> historicDetailsForm = activitiRule
.getHistoryService()
.createHistoricDetailQuery()
.formProperties()
.listPage(0, 100);//输出历史详情
for(HistoricDetail historicDetail : historicDetailsForm){
LOGGER.info("historicDetail = {}", toString(historicDetail));
}
LOGGER.info("historicDetailsForm.size = {}",
historicDetailsForm.size());
}
private void showHistoryTask() {
List<HistoricTaskInstance> historicTaskInstances =
activitiRule.getHistoryService()
.createHistoricTaskInstanceQuery()
.listPage(0,100);
for(HistoricTaskInstance historicTaskInstance :
historicTaskInstances){
LOGGER.info("historicTaskInstance = {}", historicTaskInstance);
}
LOGGER.info("historicTaskInstances.size = {}",
historicTaskInstances.size());
}
private void showHistoryVariable() {
List<HistoricVariableInstance> historicVariableInstances
= activitiRule.getHistoryService()
.createHistoricVariableInstanceQuery().listPage(0, 100);
for(HistoricVariableInstance historicVariableInstance :
historicVariableInstances){
LOGGER.info("historicVariableInstance = {}",
historicVariableInstance);
}
LOGGER.info("historicVariableInstances.size = {}",
historicVariableInstances.size());
}
private void showHistoryActivity() {
List<HistoricActivityInstance> historicActivityInstances
= activitiRule.getHistoryService()
.createHistoricActivityInstanceQuery()
.listPage(0,100);
for(HistoricActivityInstance historicActivityInstance :
historicActivityInstances){
LOGGER.info("historicActivityInstance = {}",
historicActivityInstance);
}
LOGGER.info("historicActivityInstance.size = {}",
historicActivityInstances.size());
}
private void submitTaskFormData() {
Task task = activitiRule.getTaskService()
.createTaskQuery().singleResult();
Map<String, String> properties = Maps.newHashMap();
properties.put("formKey1", "valuef1");
properties.put("formkey2", "valuef2");
activitiRule.getFormService()
.submitTaskFormData(task.getId(),properties);
}
private void changeVariable() {
List<Execution> executions = activitiRule
.getRuntimeService()
.createExecutionQuery()
.listPage(0, 100);
for(Execution execution : executions){
LOGGER.info("execution = {}",execution);
}
LOGGER.info("execution.size = {}", executions.size());
String id = executions.iterator().next().getId();
activitiRule.getRuntimeService()
.setVariable(id, "keyStart1", "value1_");//对参数进行修改
}
private void startProcessInstance() {
Map<String, Object> params = Maps.newHashMap();
params.put("keyStart1", "value1");
params.put("keyStart2", "value2");
ProcessInstance processInstance = activitiRule.getRuntimeService()
.startProcessInstanceByKey("my-process",params);
}
static String toString(HistoricDetail historicDetail){
return ToStringBuilder.reflectionToString(historicDetail,
ToStringStyle.SHORT_PREFIX_STYLE);
}
}
3.给出activiti_historylevel.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 id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<property name="commandInvoker" ref="commandInvoker" />
<!--<property name="history" value="none" />-->
<!--<property name="history" value="activity"/>-->
<property name="history" value="audit" />
<!--<property name="history" value="full" />-->
</bean>
<bean id="commandInvoker" class="com.imooc.activiti.interceptor.MDCCommandInvoker"/>
</beans>
4.讲解:activiti的历史记录级别分为以上四种:none, activity, audit, full
级别分别由低到高能够显示不同的日志级别信息:
- none: 不记录历史流程,性能高,流程结束后不可读取
- activiti: 归档流程实例和活动实例,流程变量不同步
- audit: 默认值,在activiti基础上同步变量值,保存表单属性
- full: 性能较差,记录所有实例和变量细节变化
5.需要的话可以参考MDCCommandInvoker的代码,如下
package com.imooc.activiti.interceptor;
import org.activiti.engine.debug.ExecutionTreeUtil;
import org.activiti.engine.impl.agenda.AbstractOperation;
import org.activiti.engine.impl.interceptor.DebugCommandInvoker;
import org.activiti.engine.logging.LogMDC;
public class MDCCommandInvoker extends DebugCommandInvoker {
@Override
public void executeOperation(Runnable runnable) {
boolean mdcEnabled = LogMDC.isMDCEnabled();
LogMDC.setMDCEnabled(true);
if (runnable instanceof AbstractOperation) {
AbstractOperation operation = (AbstractOperation) runnable;
if (operation.getExecution() != null) {
LogMDC.putMDCExecution(operation.getExecution());
}
}
super.executeOperation(runnable);
LogMDC.clear();
if(!mdcEnabled){
LogMDC.setMDCEnabled(false);
}
}
}