activiti学习笔记(十五)事件日志

2018-09-23  本文已影响9人  云师兄

今天要分享的是activiti流程配置中的事件日志配置,它起到的作用是当工作流事件触发时,保存事件的日志到数据库中,记录日志。
首先我们在activiti.cfg.xml文件中添加属性如下:

<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db_activiti" />
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUsername" value="root" />
        <property name="jdbcPassword" value="abc123" />
        <property name="enableDatabaseEventLogging" value="true"></property>
</bean>

上述配置中增加的属性就是enableDatabaseEventLogging,value设置为true,表示流程启动后会自动保存事件日志到数据库中,默认这个属性值为false,即不保存日志。虽然保存了事件日志,但是并不会直接打印到控制台上,为此,需要我们在代码中获取事件日志对象,并输出,下面是个示例:

// 1. 创建流程引擎 processEngine
// 2. 创建流程定义 processDefinition
// 3. 创建流程实例 processInstance
// 4. 获取事件日志对象列表
List<EventLogEntry> eventLogEntries = processEngine.
                getManagementService().
                getEventLogEntriesByProcessInstanceId(processInstance.getProcessInstanceId());
for(EventLogEntry eventLogEntry : eventLogEntries){
            logger.info("eventLogEntries.type={},eventLogEntries.Data={}",eventLogEntry.getType(),eventLogEntry.getData());
}
logger.info("eventLogEntries.size={}",eventLogEntries.size());

上述代码中使用getManagementService()方法获取managerservice对象,并通过getEventLogEntriesByProcessInstanceId获取事件日志对象列表,最后显示这个List,结果输出如下:

[main] INFO com.activiti.HelloWorld - eventLogEntries.type=PROCESSINSTANCE_START,eventLogEntries.Data=[...]
[main] INFO com.activiti.HelloWorld - eventLogEntries.type=ACTIVITY_STARTED,eventLogEntries.Data=[...]
[main] INFO com.activiti.HelloWorld - eventLogEntries.type=ACTIVITY_COMPLETED,eventLogEntries.Data=[...]
[main] INFO com.activiti.HelloWorld - eventLogEntries.type=SEQUENCEFLOW_TAKEN,eventLogEntries.Data=[...]
[main] INFO com.activiti.HelloWorld - eventLogEntries.type=ACTIVITY_STARTED,eventLogEntries.Data=[...]
[main] INFO com.activiti.HelloWorld - eventLogEntries.type=TASK_CREATED,eventLogEntries.Data=[...]
[main] INFO com.activiti.HelloWorld - eventLogEntries.size=6

可以看到流程启动的过程中触发了上述6个事件,由于日志是保存到数据库中的,所以获取事件日志这个操作实际上也是从数据库读数据的过程。
下面我们来看下这个配置的实现过程。
首先,xml中添加这个属性对应于ProcessEngineConfigurationImpl类的方法:

public ProcessEngineConfigurationImpl setEnableDatabaseEventLogging(boolean enableDatabaseEventLogging) {
    this.enableDatabaseEventLogging = enableDatabaseEventLogging;
    return this;
  }

这个this.enableDatabaseEventLogging方法在哪里用到呢?

public void initDatabaseEventLogging() {
    if (enableDatabaseEventLogging) {
      // Database event logging uses the default logging mechanism and adds
      // a specific event listener to the list of event listeners
      getEventDispatcher().addEventListener(new EventLogger(clock, objectMapper));
    }
  }

这个初始化方法会在流程引擎创建后的初始化方法中被调用,因此enableDatabaseEventLogging为true时就会添加一个事件监听器,当监听器监听到事件触发后保存日志信息。activiti内部的监听器具体的实现细节此处不再深入,后续将会有单独一篇博客来学习。
今天是中秋节假期,在家吹着凉风,写下这篇博客,记录一下学习过程。

上一篇下一篇

猜你喜欢

热点阅读