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

 

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