Demo项目代码:
https://gitee.com/AnAnXiEr/activiti6-demo
1、事件与监听器的原理
2、监听器的配置方式
3、Activiti的事件监听
事件与监听器的原理

流程引擎启动时、监听器就注册到事件类型上
可以注册到所有的事件类型上,也可以注册到指定的几个事件类型
监听器的配置方式
- eventListeners:监听所有事件派发通知
- typedEventListeners:监听指定事件类型的通知
- activiti:eventListener:只监听特定流程定义的事件
Activiti的事件监听
事件源:Process Engine
事件类型:ENGINE_CREATED
事件:ActivitiEvent
监听:dispatcheEvent
注册:addEventListener
监听器:ActivitiEvent Listener

相关API
ActivitiEvent:事件对象
ActivitiEventListener:监听器
ActivitiEventType:事件类型
1、activiti的事件监听
cfg配置
<?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 class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration"
id="processEngineConfiguration">
<!--<property name="commandInvoker" ref="mdcCommandInvoker"/>-->
<!--eventListeners-->
<!--<property name="eventListeners">-->
<!--<list>-->
<!--<bean class="com.imooc.activiti.activitidemo.event.ProcessEventListener"></bean>-->
<!--</list>-->
<!--</property>-->
<!--typedEventListeners-->
<property name="typedEventListeners">
<map>
<entry key="PROCESS_STARTED">
<list>
<bean class="com.imooc.activiti.activitidemo.event.ProcessEventListener"></bean>
</list>
</entry>
</map>
</property>
</bean>
<bean class="com.imooc.activiti.activitidemo.interceptor.MDCCommandInvoker" id="mdcCommandInvoker"/>
</beans>
java
package com.imooc.activiti.activitidemo.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;
/**
* @Description 流程event
* @Author 胡浩
* @Date 2019/8/20
**/
public class ProcessEventListener implements ActivitiEventListener {
private static final Logger LOGGER = LoggerFactory.getLogger(ActivitiEventListener.class);
@Override
public void onEvent(ActivitiEvent activitiEvent) {
ActivitiEventType eventType = activitiEvent.getType();
if (ActivitiEventType.PROCESS_STARTED.equals(eventType)) {
LOGGER.info("流程启动 {} \t {}", eventType, activitiEvent.getProcessInstanceId());
} else if (ActivitiEventType.PROCESS_COMPLETED.equals(eventType)) {
LOGGER.info("流程结束 {} \t {}", eventType, activitiEvent.getProcessInstanceId());
}
}
@Override
public boolean isFailOnException() {
return false;
}
}
2、手工定义的事件监听
@Test
@Deployment(resources = "mdc-process.bpmn20.xml")
public void testConfig() {
ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");
Task task = activitiRule.getTaskService().createTaskQuery().singleResult();
activitiRule.getTaskService().complete(task.getId());
//手工发送事件
activitiRule.getRuntimeService().dispatchEvent(new ActivitiEventImpl(ActivitiEventType.CUSTOM));
}
CustomEventListener
package com.imooc.activiti.activitidemo.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;
/**
* @Description 自定义event
* @Author 胡浩
* @Date 2019/8/20
**/
public class CustomEventListener implements ActivitiEventListener {
private static final Logger LOGGER = LoggerFactory.getLogger(ActivitiEventListener.class);
@Override
public void onEvent(ActivitiEvent activitiEvent) {
ActivitiEventType eventType = activitiEvent.getType();
if (ActivitiEventType.CUSTOM.equals(eventType)) {
LOGGER.info("监听自定义事件 {} \t {}", eventType, activitiEvent.getProcessInstanceId());
}
}
@Override
public boolean isFailOnException() {
return false;
}
}
cfg
<?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 class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration"
id="processEngineConfiguration">
<!--<property name="commandInvoker" ref="mdcCommandInvoker"/>-->
<!--eventListeners-->
<property name="eventListeners">
<list>
<!--<bean class="com.imooc.activiti.activitidemo.event.ProcessEventListener"></bean>-->
<bean class="com.imooc.activiti.activitidemo.event.CustomEventListener"></bean>
</list>
</property>
<!--typedEventListeners-->
<!--<property name="typedEventListeners">-->
<!--<map>-->
<!--<entry key="PROCESS_STARTED">-->
<!--<list>-->
<!--<bean class="com.imooc.activiti.activitidemo.event.ProcessEventListener"></bean>-->
<!--</list>-->
<!--</entry>-->
<!--</map>-->
<!--</property>-->
</bean>
<bean class="com.imooc.activiti.activitidemo.interceptor.MDCCommandInvoker" id="mdcCommandInvoker"/>
</beans>
3、代码监听,不在cfg里配置
@Test
@Deployment(resources = "mdc-process.bpmn20.xml")
public void testConfig() {
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));
}
网友评论