【Activiti系列学习】--11.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);
        }
    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值