这篇来讲述activiti的监听器配置,主要从以下三个方面来了解:
1、事件及监听器原理
2、监听器的配置方式
3、Activiti的事件监听测试实例
首先这里事件源与事件类型的关系我们可以这里理解:创建一个流程引擎,那么事件源就是流程引擎对象Process Engine,事件类型就是ENGINE_CREATED。创建过程中触发了 ActivitiEvent 这个事件,当这个事件被分发或者发布时会被 ActivitiEventListener 监听器监听到这个事件。我们可以在一个事件上监听多个监听器。具体过程如下图:
这里最重要的API如下:
ActivitiEvent:事件对象,activiti的所有事件对象都是ActivitiEvent的实现,它是整个事件最高的接口。
ActivitiEventListener:监听器,也是所有监听器的抽象接口。
ActivitiEventType:事件类型,是个枚举类型,其中包括30多种枚举类型。也提供了custom这一类型,如果要自己定义类型可以使用这个类型。
这个监听器我们可以在流程引擎的配置对象中配置,有三种配置方式
eventListeners:监听所有事件派发通知,只要流程引擎发布的事件类型都会通知到监听器。
typedEventListeners:监听指定事件类型的通知,在注册时指定只监听哪一类型的事件。
activiti:eventListener:只监听指定流程定义的事件,一般不会定义为全局类型的定义。
一、首先我们创建单元测试类 ConfigEventListenerTest:
测试代码如下:
package com.jjf.activiti.config;
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"); //我们配置使用activiti_eventListener.cfg.xml文件
@Test
@Deployment(resources = {"com/jjf/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()); //执行Task
}
}
这里我们是使用自带的测试流程图 my-process.bpmn20.xml ,将配置文件改为 activiti_eventListener.cfg.xml 。
二、创建单元测试配置文件 activiti_eventListener.cfg.xml
单元测试配置内容如下:
这里我们使用了 ProcessEventList 监听器。
三、创建 ProcessEventList
这个 ProcessEventList 监听类为了当遇到 ActivitiEventType 中的 PROCESS_STARTED与PROCESS_COMPLETED 事件类型则输出对应的信息。
package com.jjf.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;
/**
* 流程 event
*/
public class ProcessEventList implements ActivitiEventListener {
private static final Logger LOGGER = LoggerFactory.getLogger(ProcessEventList.class);
@Override
public void onEvent(ActivitiEvent event){
ActivitiEventType eventType = event.getType();
if (ActivitiEventType.PROCESS_STARTED.equals(eventType)){ //如果这个事件类型是 流程启动
LOGGER.info("流程启动: [{}] \t [{}]" , eventType,event.getProcessInstanceId()); //输出事件的类型与ID
}else if (ActivitiEventType.PROCESS_COMPLETED.equals(eventType)){ //如果流程结束
LOGGER.info("流程结束: [{}] \t [{}]" , eventType,event.getProcessInstanceId());
}
}
@Override
public boolean isFailOnException() {
return false;
}
}
四、测试执行结果
可以看到流程启动时打印出流程启动的信息,结束时打印出结束的信息。
接下去我们使用另一种方式(按照类型)来配置
修改单元测试配置文件 activiti_eventListener.cfg.xml
这里我们配置了 typedEventListeners 类型的监听,例子中我们只监听流程启动这个事件。
我们再重新测试执行:
可以看到只监听到了流程启动事件。
我们使用自己定义的类型进行测试:
在 ConfigEventListenerTest 的test方法中添加下列代码:
activitiRule.getRuntimeService().dispatchEvent(new ActivitiEventImpl(ActivitiEventType.CUSTOM)); //选择custom,避免跟系统自带的产生冲突
重新创建一个监听自己定义的监听器:
CustomEventListener 代码如下:
package com.jjf.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;
/**
* 流程 event
*/
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()); //输出事件的类型与ID
}
}
@Override
public boolean isFailOnException() {
return false;
}
}
修改配置文件:
测试结果如下:
我们可以监听到我们自己定义的事件。
不使用配置文件,通过程序注册监听
在 ConfigEventListenerTest 的test方法中添加下列代码:
activitiRule.getRuntimeService().addEventListener(new CustomEventListener()); //不使用cfg.xml配置事件监听
测试结果:
我们也可以直接监听到自定义的事件。
以上就是activiti流程引擎对监听器配置的一些小例子。