Activiti5.22 如何配置自定义日志监听器【源码分析实现】

Activiti5.22 如何配置自定义日志监听器【源码分析实现】


我们可以通过以下4个概念来完成

1,日志清洗器;

2,日志处理器;

3,日志监听器;

4,配置类。


下面开始具体说下:

A,日志清洗器,顾名思义,就是对那些流程或者对那些状态的流程,才能进入到日志监听器;

完成该步骤一般是重写AbstractEventFlusher类的closing方法,我这里对该方法进行注释,加深我自己理解,代码如下

    @Override
    public void closing(CommandContext commandContext) {
        // TODO 获得eventLogEntityManager 对象
        EventLogEntryEntityManager eventLogEntryEntityManager = commandContext.getEventLogEntryEntityManager();
        //遍历eventHandlers集和,该集和存在于父类中
        for(EventLoggerEventHandler eventHandler:eventHandlers) {
            //获得EventLogEntryEntity对象
            EventLogEntryEntity generateEventLogEntry = eventHandler.generateEventLogEntry(commandContext);

            //可通过 generateEventLogEntry.getType() 获得当前的日志类型,比如 TASK_CREATED TASK_COMPLETED PROCESSINSTANCE_START PROCESSINSTANCE_END等类型
            //还可以通过流程定义的id来进清洗
            //根据类型不同进行下面的insert操作
            //将获取之后的日志实体转换为符合要求的实体对象,并添加到会话缓存中,此时数据还没有存入到数据库中
            eventLogEntryEntityManager.insert(generateEventLogEntry);
        }
    }

B,日志处理器,即是将日志进行存入到文件,数据库,或第三方

完成这一步一般是重写AbstractTaskEventHandler的generateEventLogEntry方法

需要注意的是,此方法您不能返回 null

源码如下:

    @Override
    public EventLogEntryEntity generateEventLogEntry(CommandContext commandContext) {
        TaskEntity task = (TaskEntity) ((ActivitiEntityEvent) event).getEntity();
        Map<String, Object> data = handleCommonTaskFields(task);
    return createEventLogEntry(task.getProcessDefinitionId(), task.getProcessInstanceId(), task.getExecutionId(), task.getId(), data);
    }

C,日志监听器,即将我们上面配置好的日志清洗器和日志处理器加入到这个监听器即可

我们需要继承EventLogger类

重写createEventFlusher方法,返回自定义清洗器即可

重写initializeDefaultHandlers方法,加入我们自定义的拦截器

addEventHandler(ActivitiEventType.TASK_CREATED, TaskUpdateEventHandler.class);

可无需引入父类的initializeDefaultHandlers

通过分析可以发现,这个监听器会向日志数据库里插入两条流程开始和流程结束的数据,本例一共就会插入三条数据

D,配置类

配置类主要是我们调用需要,上面的工作做完了,没有下面的步骤等于没有做

重写StandaloneProcessEngineConfiguration类的initDatabaseEventLogging方法

代码如下

    protected void initDatabaseEventLogging() {
        // TODO 使用我们自定义的LogEventLogger作为日志监听器,需要在xml中进行配置
        if(enableDatabaseEventLogging) {
            getEventDispatcher().addEventListener(new LogEventLogger(clock,objectMapper));
        }
    }

自此,Activiti自定义日志监听器就实现了,我也是刚实现,大家一起讨论吧


爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img