【Activiti系列学习】--12.事件处理及监听器配置--eventlog

目录

基于ConfigMDCTest创建configEventLogTest

创建事件监听器的类ConfigEventListenerTest


本文所涉及到的内容:事件及监听器配置

  • 事件及监听器原理
  • 监听器的配置方式
  • Activiti的事件监听

 

监听器注册在事件上,对应的API如下:

ActivitiEvent:事件对象 ActivitiEventListener:监听器 ActivitiEventType:事件类型

基于ConfigMDCTest创建configEventLogTest

编写并修改以下代码:

public class ConfigEventLogTest {
    private static final Logger LOGGER = LoggerFactory
            .getLogger(ConfigEventLogTest.class);
    @Rule
    public ActivitiRule activitiRule = new ActivitiRule("activiti_eventlog.cfg.xml");

    @Test
    @Deployment(resources = {"com/imooc/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());
        List<EventLogEntry> eventLogEntries = activitiRule.getManagementService()
                .getEventLogEntriesByProcessInstanceId(
                        processInstance.getProcessInstanceId());

        for(EventLogEntry eventLogEntry : eventLogEntries){
            LOGGER.info("eventLog.type = {},eventLog.data = {}" ,
                    eventLogEntry.getType(), new String(eventLogEntry.getData()));
        }
        LOGGER.info("eventLogEntries.size = {}", eventLogEntries.size());
    }
}

创建并别写activiti_eventlog.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="commandInvoker" ref="commandInvoker" />
    <property name="enableDatabaseEventLogging" value="false" />
  </bean>

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

</beans>

事件处理记录效果如下:

创建事件监听器的类ConfigEventListenerTest

package com.imooc.activiti.myconfig;

import com.imooc.activiti.event.CustomEventListener;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.impl.ActivitiEventImpl;
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");

    @Test
    @Deployment(resources = {"com/imooc/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());

        activitiRule.getRuntimeService()
                .addEventListener(new CustomEventListener());//添加一个事件监听
        activitiRule.getRuntimeService()
                .dispatchEvent(new ActivitiEventImpl(ActivitiEventType.CUSTOM));//发布一个事件
    }
}

创建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="commandInvoker" ref="commandInvoker" />
    <property name="eventListeners" >
      <list>
        <!--<bean class="com.imooc.activiti.event.ProcessEventListener"/>-->
        <!--<bean class="com.imooc.activiti.event.CustomEventListener"/>-->
      </list>
    </property>
    <!--<property name="typedEventListeners">-->
      <!--<map>-->
        <!--<entry key="PROCESS_STARTED">-->
          <!--<list>-->
            <!--<bean class="com.imooc.activiti.event.ProcessEventListener"/>-->
          <!--</list>-->
        <!--</entry>-->
      <!--</map>-->
    <!--</property>-->
  </bean>

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

</beans>

说明:创建监听器的几种方式:ProcessEventListener, CustomEventListener, 直接在配置文件中添加一个事件监听

activitiRule.getRuntimeService().addEventListener(new CustomEventListener());//添加一个事件监听

以上的ProcessEventListener, CustomEventListener需要自己定义类文件,写出监听触发的事件

(1)举ProcessEventListener的例子,这个类需要继承ActivitiEventListener类,然后重写其中的onEvent()方法

package com.imooc.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;

public class ProcessEventListener implements ActivitiEventListener {
    private static final Logger LOGGER = LoggerFactory.getLogger(ProcessEventListener.class);
    @Override
    public void onEvent(ActivitiEvent event) {
        ActivitiEventType eventType = event.getType();
        if(ActivitiEventType.PROCESS_STARTED.equals(eventType)){
            LOGGER.info("流程启动 {} \t {}", eventType, event.getProcessInstanceId());
        }
        else if(ActivitiEventType.PROCESS_COMPLETED.equals(eventType)){
            LOGGER.info("流程结束 {} \t {}", eventType, event.getProcessInstanceId());
        }
    }

    @Override
    public boolean isFailOnException() {
        return false;
    }
}

(2)同理,CustomEventListener这个类也是我们自己定义的类,同样需要继承ActivitiEventListener父类

package com.imooc.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;

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

    @Override
    public boolean isFailOnException() {
        return false;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章