flowable实现全局监听器的两种方式解决6.4.0版本FlowableEventDispatcher dispatcher =

时间:2025-03-22 08:58:24

flowable实现全局监听器的两种方式解决6.4.0版本FlowableEventDispatcher dispatcher = ()为空的问题

1.自定义监听器的业务实现

package com.flowable.demo.handle;

import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent;
import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener;
import org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl;
import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;

import java.util.Date;

@Component("globalProcistEndListener")
public class GlobalProcistEndListener extends AbstractFlowableEngineEventListener {
    protected Logger logger = LoggerFactory.getLogger(this.getClass());

		//任务创建时触发
    @Override
    protected void taskCreated(FlowableEngineEntityEvent event) {
        //监听器为同步的,要想获取当前线程的提交的数据,可以手动提交事务
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCommit() {
                //主线程的事务提交之后执行
            }
        });
        TaskEntity taskEntity= (TaskEntity)event.getEntity();
        //todo 处理业务逻辑
    }

    @Override
    protected void processCompleted(FlowableEngineEntityEvent event) {
       //流程结束时触发
       TaskEntity taskEntity= (TaskEntity)event.getEntity();
       //toto 处理业务逻辑
    }

}

2.全局监听器的配置

2.1 方式一:

package com.flowable.demo.config;

import com.flowable.demo.handle.GlobalProcistEndListener;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType;
import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;

/**
 * Flowable全局监听配置
 * 用途:在任务特殊节点或者流程的特殊节点做一些自定义操作
 **/
@Configuration
public class FlowableGlobListenerConfig implements ApplicationListener<ContextRefreshedEvent> {
    @Autowired
    private SpringProcessEngineConfiguration configuration;

    @Autowired
    private GlobalProcistEndListener globalProcistEndListener;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        FlowableEventDispatcher dispatcher = configuration.getEventDispatcher();

        //流程结束全局监听
        dispatcher.addEventListener(globalProcistEndListener, FlowableEngineEventType.PROCESS_COMPLETED);
        //任务创建时进行监听,可根据需求 自己选择监听器触发时间
        dispatcher.addEventListener(globalProcistEndListener, FlowableEngineEventType.TASK_CREATED);
    }

}

该方式进行配置时遇到了一点问题,在flow able 6.4.0版本使用该方式时,FlowableEventDispatcher dispatcher = ();获取到的dispatcher为空,但是在更高版本(6.7.0)的flow able中没有遇到这个问题,所有还有另外一种配置方式。

2.2方式二

package com.flowable.demo.config;

import com.flowable.demo.handle.GlobalProcistEndListener;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType;
import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;

public class InitListenerConfig implements CommandLineRunner {
    
    @Autowired
    private SpringProcessEngineConfiguration configuration;
    @Autowired
    private GlobalProcistEndListener globalProcistEndListener;
    
    
    @Override
    public void run(String... args) throws Exception {
        FlowableEventDispatcher dispatcher = configuration.getEventDispatcher();
        //流程完成时触发
        dispatcher.addEventListener(globalProcistEndListener, FlowableEngineEventType.PROCESS_COMPLETED);
        //任务创建时触发
        dispatcher.addEventListener(globalProcistEndListener, FlowableEngineEventType.TASK_CREATED);
    }
}

此方式在低版本的flow able中也可以配置成功,原因应该是用方式一配置时,SpringProcessEngineConfiguration 这个bean还没有初始化完毕,导致();获取到的bean为空,源码里面6.7.0版本做了特殊处理,再判断为空的时候进行了初始化操作,而6.4.0版本没有初始化操作,所以第一张方式配置不成功。此配置方式是在SpringProcessEngineConfiguration 初始化完成以后才进入到配置类里面的,所以();可以获取到bean。