测试Activiti中的MDC流程跟踪(与spring整合)

1、测试Activiti中的MDC流程跟踪

  • 1、配置activiti.xml配置文件,内容如下:
   <!-- 覆盖引擎的配置 -->
    <bean id="processEngineConfiguration"
          class="org.activiti.spring.SpringProcessEngineConfiguration">
        <!--数据库配置-->
        <property name="dataSource" ref="dataSource"/>
        <!--事务管理,如果自己定义了, 那么就会覆盖原事务管理 -->
        <property name="transactionManager" ref="transactionManager"/>
        <!-- 是否自动创建表 -->
        <property name="databaseSchemaUpdate" value="true" />
        <property name="activityFontName" value="宋体"/>
        <property name="labelFontName" value="宋体"/>
    </bean>

    <!--配置引擎工厂 -->
    <bean id = "processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
    </bean>

    <!-- 暴露服务给spring -->
    <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
    <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>
    <bean id="formService" factory-bean="processEngine" factory-method="getFormService"/>
    <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>
    <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
    <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>
    <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/>

    <!--测试类-->
    <bean id="activitiRule" class="org.activiti.engine.test.ActivitiRule">
        <property name="processEngine" ref="processEngine"/>
    </bean>

    <!--mdc拦截器 跟踪task-->
    <bean id="commandInvoker" class="com.example.activiti.interceptor.MDCCommandInvoker"/>

    <!--德鲁伊数据连接池-->
    <bean id ="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false" />
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="username" value="root" />
        <property name="password" value="199633" />
        <property name="initialSize" value="1"/>
        <property name="maxActive" value="10"/>
        <property name="filters" value="stat, slf4j"/>
    </bean>

    <!-- 事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--测试bean-->
    <bean id="helloBean" class="com.example.activiti.bean.HelloBean"/>
  • 2、写一个拦截类:
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);
		//【清理MDC信息】为保证环境的清洁
		LogMDC.clear();
		//如果原来的值是不生效的
		if(!mdcEnabled){
			//把他的值重新还原一下
			LogMDC.setMDCEnabled(false);
		}
	}
}

  • 3、流程文件(如果为xml格式必须为xxx.bpmn20.xml)
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="my-process">
    <startEvent id="start"/>
    <sequenceFlow sourceRef="start" targetRef="someTask" id="flow1"/>
    <userTask id="someTask" name="执行到我了"/>
    <!--这里${helloBean.sayHello()},helloBean是在spring中注册的bean id, sayHello是方法名-->
    <serviceTask id="helloBean" activiti:expression="${helloBean.sayHello()}}"/>
    <endEvent id="end"/>
    <sequenceFlow id="flow2" sourceRef="someTask" targetRef="helloBean"/>
    <sequenceFlow id="flow3" sourceRef="helloBean" targetRef="end"/>
</process>
</definitions>
  • 3、HelloBean:
public class HelloBean {

	private static final Logger LOGGER = LoggerFactory.getLogger(HelloBean.class);

	public void sayHello() {
		LOGGER.info("HelloBean, 我被执行到了");
	}
}

  • 4、测试类(注意在写测试类的时候,@Deployment 注解要与 activitiRule搭配使用,否则测试部署不成功):
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:activiti-context.xml"})
public class ConfigSpringTest {

	private static final Logger LOGGER = LoggerFactory.getLogger(ConfigSpringTest.class);

	@Rule
	@Autowired
	public ActivitiRule activitiRule;

	@Autowired
	private RuntimeService runtimeService;

	@Autowired
	private TaskService taskService;

	@Test
	@Deployment(resources = {"my-process.bpmn20.xml"})
	public void testConfig() {

		ProcessInstance processInstance = runtimeService
				.startProcessInstanceByKey("my-process");
		Assert.assertNotNull(processInstance);

		Task task = taskService.createTaskQuery().singleResult();
		Assert.assertEquals("执行到我了", task.getName());
		activitiRule.getTaskService().complete(task.getId());
	}
}

输出结果类似下文

└── 170006 : start (StartEvent, parent id 170005 (active)
 ProcessDefinitionId=my-process:1:170003     executionId=170006 mdcProcessInstanceID=170005 mdcBusinessKey= o.a.e.i.i.DebugCommandInvoker.executeOperation:34
20:14:57.538[main][INFO ]Execution tree while executing operation class org.activiti.engine.impl.agenda.ContinueProcessOperation : ProcessDefinitionId=my-process:1:170003     executionId=170006 mdcProcessInstanceID=170005 mdcBusinessKey= o.a.e.i.i.DebugCommandInvoker.executeOperation:33
20:14:57.539[main][INFO ]
170005 (process instance)
└── 170006 : start -> someTask, parent id 170005 (active)
 ProcessDefinitionId=my-process:1:170003     executionId=170006 mdcProcessInstanceID=170005 mdcBusinessKey= o.a.e.i.i.DebugCommandInvoker.executeOperation:34
20:14:57.540[main][INFO ]Execution tree while executing operation class org.activiti.engine.impl.agenda.ContinueProcessOperation : ProcessDefinitionId=my-process:1:170003     executionId=170006 mdcProcessInstanceID=170005 mdcBusinessKey= o.a.e.i.i.DebugCommandInvoker.executeOperation:33
20:14:57.540[main][INFO ]
170005 (process instance)
└── 170006 : someTask (UserTask, parent id 170005 (active)

猜你喜欢

转载自blog.csdn.net/qq_42046342/article/details/100862890