Flowable源码地址:https://github.com/flowable/flowable-engine
包路径:org.flowable.engine.test.api.event
FlowableEventDispatcherTest Flowable事件调度器测试类
public class FlowableEventDispatcherTest extends PluggableFlowableTestCase {
...
/**
* 测试Flowable附带的基础实体事件监听器{@link BaseEntityEventListener}。
*/
@Test
public void testBaseEntityEventListener() throws Exception {
TestBaseEntityEventListener listener = new TestBaseEntityEventListener();
dispatcher.addEventListener(listener);
TaskServiceConfiguration taskServiceConfiguration = (TaskServiceConfiguration) processEngineConfiguration.getServiceConfigurations()
.get(EngineConfigurationConstants.KEY_TASK_SERVICE_CONFIG);
FlowableEntityEventImpl createEvent = new FlowableEntityEventImpl(taskServiceConfiguration.getTaskEntityManager().create(),
FlowableEngineEventType.ENTITY_CREATED);
FlowableEntityEventImpl deleteEvent = new FlowableEntityEventImpl(taskServiceConfiguration.getTaskEntityManager().create(),
FlowableEngineEventType.ENTITY_DELETED);
FlowableEntityEventImpl updateEvent = new FlowableEntityEventImpl(taskServiceConfiguration.getTaskEntityManager().create(),
FlowableEngineEventType.ENTITY_UPDATED);
FlowableEntityEventImpl otherEvent = new FlowableEntityEventImpl(taskServiceConfiguration.getTaskEntityManager().create(),
FlowableEngineEventType.CUSTOM);
// 调度创建事件
dispatcher.dispatchEvent(createEvent, processEngineConfiguration.getEngineCfgKey());
assertThat(listener.isCreateReceived()).isTrue();
assertThat(listener.isUpdateReceived()).isFalse();
assertThat(listener.isCustomReceived()).isFalse();
assertThat(listener.isInitializeReceived()).isFalse();
assertThat(listener.isDeleteReceived()).isFalse();
listener.reset();
// 调度更新事件
dispatcher.dispatchEvent(updateEvent, processEngineConfiguration.getEngineCfgKey());
assertThat(listener.isUpdateReceived()).isTrue();
assertThat(listener.isCreateReceived()).isFalse();
assertThat(listener.isCustomReceived()).isFalse();
assertThat(listener.isDeleteReceived()).isFalse();
listener.reset();
// 调度删除事件
dispatcher.dispatchEvent(deleteEvent, processEngineConfiguration.getEngineCfgKey());
assertThat(listener.isDeleteReceived()).isTrue();
assertThat(listener.isCreateReceived()).isFalse();
assertThat(listener.isCustomReceived()).isFalse();
assertThat(listener.isUpdateReceived()).isFalse();
listener.reset();
// 调度其他事件
dispatcher.dispatchEvent(otherEvent, processEngineConfiguration.getEngineCfgKey());
assertThat(listener.isCustomReceived()).isTrue();
assertThat(listener.isCreateReceived()).isFalse();
assertThat(listener.isUpdateReceived()).isFalse();
assertThat(listener.isDeleteReceived()).isFalse();
listener.reset();
// 测试类型实体监听器
listener = new TestBaseEntityEventListener(org.flowable.task.api.Task.class);
// 应收到任务的调度事件
dispatcher.addEventListener(listener);
dispatcher.dispatchEvent(createEvent, processEngineConfiguration.getEngineCfgKey());
assertThat(listener.isCreateReceived()).isTrue();
listener.reset();
// 不应接收执行的调度事件
FlowableEntityEventImpl createEventForExecution = new FlowableEntityEventImpl(new ExecutionEntityImpl(), FlowableEngineEventType.ENTITY_CREATED);
dispatcher.dispatchEvent(createEventForExecution, processEngineConfiguration.getEngineCfgKey());
assertThat(listener.isCreateReceived()).isFalse();
}
/**
* 在监听器中发生异常时测试调度行为
*/
@Test
public void testExceptionInListener() throws Exception {
// 创建不强制分派失败的侦听器
TestExceptionFlowableEventListener listener = new TestExceptionFlowableEventListener(false);
TestFlowableEventListener secondListener = new TestFlowableEventListener();
dispatcher.addEventListener(listener);
dispatcher.addEventListener(secondListener);
FlowableEngineEventImpl event = new FlowableProcessEventImpl(FlowableEngineEventType.ENTITY_CREATED);
assertThatCode(() -> {
dispatcher.dispatchEvent(event, processEngineConfiguration.getEngineCfgKey());
}).doesNotThrowAnyException();
assertThat(secondListener.getEventsReceived()).hasSize(1);
// 删除监听器
dispatcher.removeEventListener(listener);
dispatcher.removeEventListener(secondListener);
// 创建强制分派失败的监听器
listener = new TestExceptionFlowableEventListener(true);
secondListener = new TestFlowableEventListener();
dispatcher.addEventListener(listener);
dispatcher.addEventListener(secondListener);
assertThatThrownBy(() -> dispatcher.dispatchEvent(event, processEngineConfiguration.getEngineCfgKey()))
.isExactlyInstanceOf(RuntimeException.class)
.hasMessage("Test exception");
// 不应该调用第二个侦听器
assertThat(secondListener.getEventsReceived()).isEmpty();
}
/**
* 测试Flowable引擎事件类型{ @link FlowableEngineeEventType }列表中字符串值(和列表)的转换,用于流程引擎的配置
* {@link ProcessEngineConfigurationImpl#setTypedEventListeners(java.util.Map)}。
*/
@Test
public void testActivitiEventTypeParsing() throws Exception {
// 使用空null进行检查
FlowableEngineEventType[] types = FlowableEngineEventType.getTypesFromString(null);
assertThat(types).isEmpty();
// 用空字符串检查
types = FlowableEngineEventType.getTypesFromString("");
assertThat(types).isEmpty();
// 单个值
types = FlowableEngineEventType.getTypesFromString("ENTITY_CREATED");
assertThat(types).hasSize(1);
assertThat(types[0]).isEqualTo(FlowableEngineEventType.ENTITY_CREATED);
// 多个值
types = FlowableEngineEventType.getTypesFromString("ENTITY_CREATED,ENTITY_DELETED");
assertThat(types).hasSize(2);
assertThat(types[0]).isEqualTo(FlowableEngineEventType.ENTITY_CREATED);
assertThat(types[1]).isEqualTo(FlowableEngineEventType.ENTITY_DELETED);
// 应忽略分隔符
types = FlowableEngineEventType.getTypesFromString(",ENTITY_CREATED,,ENTITY_DELETED,,,");
assertThat(types).hasSize(2);
assertThat(types[0]).isEqualTo(FlowableEngineEventType.ENTITY_CREATED);
assertThat(types[1]).isEqualTo(FlowableEngineEventType.ENTITY_DELETED);
// 无效的类型名
assertThatThrownBy(() -> FlowableEngineEventType.getTypesFromString("WHOOPS,ENTITY_DELETED"))
.isExactlyInstanceOf(FlowableIllegalArgumentException.class)
.hasMessage("Invalid event-type: WHOOPS");
}
}