目录
基于ConfigMDCTest创建configEventLogTest
创建事件监听器的类ConfigEventListenerTest
本文所涉及到的内容:事件及监听器配置
- 事件及监听器原理
- 监听器的配置方式
- Activiti的事件监听
监听器注册在事件上,对应的API如下:
ActivitiEvent:事件对象 ActivitiEventListener:监听器 ActivitiEventType:事件类型
基于ConfigMDCTest创建configEventLogTest
编写并修改以下代码:
public class ConfigEventLogTest {
private static final Logger LOGGER = LoggerFactory
.getLogger(ConfigEventLogTest.class);
@Rule
public ActivitiRule activitiRule = new ActivitiRule("activiti_eventlog.cfg.xml");
@Test
@Deployment(resources = {"com/imooc/activiti/my-process.bpmn20.xml"})
public void test() {
ProcessInstance processInstance = activitiRule.getRuntimeService()
.startProcessInstanceByKey("my-process");
Task task = activitiRule.getTaskService().createTaskQuery().singleResult();
activitiRule.getTaskService().complete(task.getId());
List<EventLogEntry> eventLogEntries = activitiRule.getManagementService()
.getEventLogEntriesByProcessInstanceId(
processInstance.getProcessInstanceId());
for(EventLogEntry eventLogEntry : eventLogEntries){
LOGGER.info("eventLog.type = {},eventLog.data = {}" ,
eventLogEntry.getType(), new String(eventLogEntry.getData()));
}
LOGGER.info("eventLogEntries.size = {}", eventLogEntries.size());
}
}
创建并别写activiti_eventlog.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="enableDatabaseEventLogging" value="false" />
</bean>
<bean id="commandInvoker" class="com.imooc.activiti.interceptor.MDCCommandInvoker"/>
</beans>
事件处理记录效果如下:
创建事件监听器的类ConfigEventListenerTest
package com.imooc.activiti.myconfig;
import com.imooc.activiti.event.CustomEventListener;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.impl.ActivitiEventImpl;
import org.activiti.engine.event.EventLogEntry;
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.junit.Rule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
public class ConfigEventListenerTest {
private static final Logger LOGGER = LoggerFactory
.getLogger(ConfigEventListenerTest.class);
@Rule
public ActivitiRule activitiRule = new ActivitiRule("activiti_eventlistener.cfg.xml");
@Test
@Deployment(resources = {"com/imooc/activiti/my-process.bpmn20.xml"})
public void test() {
ProcessInstance processInstance = activitiRule.getRuntimeService()
.startProcessInstanceByKey("my-process");
Task task = activitiRule.getTaskService().createTaskQuery().singleResult();
activitiRule.getTaskService().complete(task.getId());
activitiRule.getRuntimeService()
.addEventListener(new CustomEventListener());//添加一个事件监听
activitiRule.getRuntimeService()
.dispatchEvent(new ActivitiEventImpl(ActivitiEventType.CUSTOM));//发布一个事件
}
}
创建activiti_eventlistener.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="eventListeners" >
<list>
<!--<bean class="com.imooc.activiti.event.ProcessEventListener"/>-->
<!--<bean class="com.imooc.activiti.event.CustomEventListener"/>-->
</list>
</property>
<!--<property name="typedEventListeners">-->
<!--<map>-->
<!--<entry key="PROCESS_STARTED">-->
<!--<list>-->
<!--<bean class="com.imooc.activiti.event.ProcessEventListener"/>-->
<!--</list>-->
<!--</entry>-->
<!--</map>-->
<!--</property>-->
</bean>
<bean id="commandInvoker" class="com.imooc.activiti.interceptor.MDCCommandInvoker"/>
</beans>
说明:创建监听器的几种方式:ProcessEventListener, CustomEventListener, 直接在配置文件中添加一个事件监听
activitiRule.getRuntimeService().addEventListener(new CustomEventListener());//添加一个事件监听
以上的ProcessEventListener, CustomEventListener需要自己定义类文件,写出监听触发的事件
(1)举ProcessEventListener的例子,这个类需要继承ActivitiEventListener类,然后重写其中的onEvent()方法
package com.imooc.activiti.event;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.delegate.event.ActivitiEventListener;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ProcessEventListener implements ActivitiEventListener {
private static final Logger LOGGER = LoggerFactory.getLogger(ProcessEventListener.class);
@Override
public void onEvent(ActivitiEvent event) {
ActivitiEventType eventType = event.getType();
if(ActivitiEventType.PROCESS_STARTED.equals(eventType)){
LOGGER.info("流程启动 {} \t {}", eventType, event.getProcessInstanceId());
}
else if(ActivitiEventType.PROCESS_COMPLETED.equals(eventType)){
LOGGER.info("流程结束 {} \t {}", eventType, event.getProcessInstanceId());
}
}
@Override
public boolean isFailOnException() {
return false;
}
}
(2)同理,CustomEventListener这个类也是我们自己定义的类,同样需要继承ActivitiEventListener父类
package com.imooc.activiti.event;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.delegate.event.ActivitiEventListener;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CustomEventListener implements ActivitiEventListener {
private static final Logger LOGGER = LoggerFactory.getLogger(CustomEventListener.class);
@Override
public void onEvent(ActivitiEvent event) {
ActivitiEventType eventType = event.getType();
if(ActivitiEventType.CUSTOM.equals(eventType)){
LOGGER.info("监听到自定义事件 {} \t {}", eventType, event.getProcessInstanceId());
}
}
@Override
public boolean isFailOnException() {
return false;
}
}