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&characterEncoding=utf-8&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"/>
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>
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)