Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置

这篇来讲述activiti的监听器配置,主要从以下三个方面来了解:

1、事件及监听器原理

2、监听器的配置方式

3、Activiti的事件监听测试实例


1、事件监听器原理

Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置_第1张图片

首先这里事件源与事件类型的关系我们可以这里理解:创建一个流程引擎,那么事件源就是流程引擎对象Process Engine,事件类型就是ENGINE_CREATED。创建过程中触发了 ActivitiEvent 这个事件,当这个事件被分发或者发布时会被 ActivitiEventListener 监听器监听到这个事件。我们可以在一个事件上监听多个监听器。具体过程如下图:

Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置_第2张图片

这里最重要的API如下:

ActivitiEvent:事件对象,activiti的所有事件对象都是ActivitiEvent的实现,它是整个事件最高的接口。

ActivitiEventListener:监听器,也是所有监听器的抽象接口。

ActivitiEventType:事件类型,是个枚举类型,其中包括30多种枚举类型。也提供了custom这一类型,如果要自己定义类型可以使用这个类型。

 

2、监听器配置方式

这个监听器我们可以在流程引擎的配置对象中配置,有三种配置方式

eventListeners:监听所有事件派发通知,只要流程引擎发布的事件类型都会通知到监听器。

typedEventListeners:监听指定事件类型的通知,在注册时指定只监听哪一类型的事件。

activiti:eventListener:只监听指定流程定义的事件,一般不会定义为全局类型的定义。

 

3、Activiti的事件监听测试实例

一、首先我们创建单元测试类 ConfigEventListenerTest:

Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置_第3张图片

测试代码如下:

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

Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置_第4张图片

单元测试配置内容如下:




  
    
    
    
    

       
    
      
        
      
          

  

  


这里我们使用了 ProcessEventList 监听器。

三、创建 ProcessEventList

Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置_第5张图片

这个 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;
    }
}

四、测试执行结果

Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置_第6张图片

可以看到流程启动时打印出流程启动的信息,结束时打印出结束的信息。


接下去我们使用另一种方式(按照类型)来配置

修改单元测试配置文件 activiti_eventListener.cfg.xml

这里我们配置了 typedEventListeners 类型的监听,例子中我们只监听流程启动这个事件。




  
    
    
    
    

    
      
        
          
            
          
        
      
        
  

  


我们再重新测试执行:

Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置_第7张图片

可以看到只监听到了流程启动事件。


我们使用自己定义的类型进行测试:

在 ConfigEventListenerTest 的test方法中添加下列代码:

activitiRule.getRuntimeService().dispatchEvent(new ActivitiEventImpl(ActivitiEventType.CUSTOM));   //选择custom,避免跟系统自带的产生冲突

如下图:Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置_第8张图片

重新创建一个监听自己定义的监听器

Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置_第9张图片

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;
    }
}

修改配置文件




  
    
    
    
    

    
      
        
      
        

  

  


测试结果如下:

Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置_第10张图片

我们可以监听到我们自己定义的事件。


不使用配置文件,通过程序注册监听

在 ConfigEventListenerTest 的test方法中添加下列代码:

activitiRule.getRuntimeService().addEventListener(new CustomEventListener());   //不使用cfg.xml配置事件监听

Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置_第11张图片

测试结果:

Activiti6.0流程引擎学习——(18)activiti流程引擎的监听器配置_第12张图片

我们也可以直接监听到自定义的事件。

以上就是activiti流程引擎对监听器配置的一些小例子。

你可能感兴趣的:(activiti)