美文网首页
activiti学习笔记(十五)事件日志

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

作者: 云师兄 | 来源:发表于2018-09-23 21:45 被阅读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内部的监听器具体的实现细节此处不再深入,后续将会有单独一篇博客来学习。
    今天是中秋节假期,在家吹着凉风,写下这篇博客,记录一下学习过程。

    相关文章

      网友评论

          本文标题:activiti学习笔记(十五)事件日志

          本文链接:https://www.haomeiwen.com/subject/knmqoftx.html