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

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

1、事件及监听器原理

2、监听器的配置方式

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


1、事件监听器原理

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

这里最重要的API如下:

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

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

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

 

2、监听器配置方式

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

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

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

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

 

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

一、首先我们创建单元测试类 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

单元测试配置内容如下:

<?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="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000;MVCC=TRUE" />
    <property name="jdbcDriver" value="org.h2.Driver" />
    <property name="jdbcUsername" value="sa" />
    <property name="jdbcPassword" value="" />

    <!--<property name="commandInvoker" ref="commandInvoker"/> -->   <!-- 使用我们自己定义的拦截器 -->
    <property name="eventListeners">
      <list>
        <bean class="com.jjf.activiti.event.ProcessEventList"/>
      </list>
    </property>      <!-- 第一种方式:eventListeners,监听所有事件类型 -->

  </bean>

  <bean id="commandInvoker" class="com.jjf.activiti.interceptor.MDCCommandInvoker"/>

</beans>

这里我们使用了 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 类型的监听,例子中我们只监听流程启动这个事件。

<?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="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000;MVCC=TRUE" />
    <property name="jdbcDriver" value="org.h2.Driver" />
    <property name="jdbcUsername" value="sa" />
    <property name="jdbcPassword" value="" />

    <property name="typedEventListeners">
      <map>
        <entry key="PROCESS_STARTED">
          <list>
            <bean class="com.jjf.activiti.event.ProcessEventList"></bean>
          </list>
        </entry>
      </map>
    </property>    <!-- 第二种方式:typedEventListeners,可以监听指定事件类型 -->
  </bean>

  <bean id="commandInvoker" class="com.jjf.activiti.interceptor.MDCCommandInvoker"/>

</beans>

我们再重新测试执行:

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


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

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

修改配置文件

<?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="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000;MVCC=TRUE" />
    <property name="jdbcDriver" value="org.h2.Driver" />
    <property name="jdbcUsername" value="sa" />
    <property name="jdbcPassword" value="" />

    <property name="eventListeners">
      <list>
        <bean class="com.jjf.activiti.event.CustomEventListener"/>
      </list>
    </property>    <!-- 监听自定义事件 -->

  </bean>

  <bean id="commandInvoker" class="com.jjf.activiti.interceptor.MDCCommandInvoker"/>

</beans>

测试结果如下:

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


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

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

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

测试结果:

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

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

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山孤客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值