flowable 全局监听

做到flowable 全局监听这一部分时,按网上查的资料,都无法正确进入监听器。
参考链接:https://blog.csdn.net/liuwenjun05101/article/details/103594484
百思不得其解……
无奈之下,去看了《Flowable BPMN 用户手册》,其中有段叙述让我茅塞顿开:

3.18.7. 附加信息
监听器只会响应其所在引擎分发的事件。因此如果在同一个数据库上运行不同的引擎,则只有该监听器注册的引擎生成的事件,才会分发给该监听器。其他引擎生成的事件不会分发给这个监听器,而不论这些引擎是否运行在同一个JVM下。
某些事件类型(与实体相关)暴露了目标实体。按照事件类型的不同,有些实体不能被更新(如实体删除事件中的实体)。如果可能的话,请使用事件暴露的EngineServices来安全地操作引擎。即使这样,更新、操作事件中暴露的实体仍然需要小心。
历史不会分发实体事件,因为它们都有对应的运行时实体分发事件。

另外一部分:

3.18.3. 在运行时添加监听器
可以使用API(RuntimeService)为引擎添加或删除事件监听器:

/**
 * 新增一个监听器,会在所有事件发生时被通知。
 * @param listenerToAdd 要新增的监听器
 */
void addEventListener(FlowableEventListener listenerToAdd);

/**
 * 新增一个监听器,在给定类型的事件发生时被通知。
 * @param listenerToAdd 要新增的监听器
 * @param types 监听器需要监听的事件类型
 */
void addEventListener(FlowableEventListener listenerToAdd, FlowableEventType... types);

/**
 * 从分发器中移除指定监听器。该监听器将不再被通知,无论该监听器注册为监听何种类型。
 * @param listenerToRemove 要移除的监听器
 */
 void removeEventListener(FlowableEventListener listenerToRemove);

经测试,使用以上方法可以有效触发监听器进行相关操作。

  • Listener
@Component
public class ProcessInstanceCompleteListener extends AbstractFlowableEngineEventListener {
    @Autowired
    private TaskService taskService;
    @Autowired
    private FormService formService;
    @Autowired
    private RuntimeService runtimeService;
    @Override
    protected void processCompleted(FlowableEngineEntityEvent event) {
        System.out.println("进入流程结束监听器……");

        String processInstanceId = event.getProcessInstanceId();
        Map<String, Object> variables = runtimeService.getVariables(processInstanceId);
        Map<String, Object> startForm = (Map<String, Object>) variables.get("startForm");
        Form form = formService.getById(new Long((String) startForm.get("formId")));

        System.out.println("variables: "+variables);
        System.out.println("startForm: "+startForm);
        System.out.println("form: " + form);

        super.processCompleted(event);
    }

    @Override
    protected void taskCompleted(FlowableEngineEntityEvent event) {
        System.out.println("进入taskCompleted监听器……");
        super.taskCompleted(event);
    }

    @Override
    public void onEvent(FlowableEvent flowableEvent) {
        System.out.println("进入taskCompleted监听器--onEvent……");
        super.onEvent(flowableEvent);
    }
}
  • 配置器
/**
 * 全局监听配置 ContextRefreshedEvent在类被初始化之后触发
 */
@Configuration
public class FlowableGlobListenerConfig implements ApplicationListener<ContextRefreshedEvent> {
    @Autowired
    private SpringProcessEngineConfiguration configuration;
    @Autowired
    private ProcessInstanceCompleteListener processInstanceCompleteListener;
    @Autowired
    private RuntimeService runtimeService;
 
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        FlowableEventDispatcher dispatcher = configuration.getEventDispatcher();
        //任务完成全局监听
        //dispatcher.addEventListener(activityCompleteListener, FlowableEngineEventType.TASK_CREATED);
        runtimeService.addEventListener(processInstanceCompleteListener, FlowableEngineEventType.PROCESS_COMPLETED);
    }
}

  • 运行截图
    在这里插入图片描述

特此记之,以供参考。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flowable 全局监听器可以用于监听所有流程引擎实例中的事件。全局监听器必须实现 org.flowable.common.engine.api.delegate.event.FlowableEventListener 接口,并且注册到流程引擎配置中。当事件发生时,监听器将被触发并执行特定的业务逻辑。 以下是一个简单的 Flowable 全局监听器示例: ```java public class MyGlobalEventListener implements FlowableEventListener { @Override public void onEvent(FlowableEvent event) { // 处理事件 System.out.println("Event received: " + event.getType()); } @Override public boolean isFailOnException() { return false; } @Override public boolean isFireOnTransactionLifecycleEvent() { return false; } } ``` 在上面的示例中,onEvent() 方法处理监听到的事件。isFailOnException() 方法返回 false,表示如果监听器出现异常,流程引擎仍将继续执行。isFireOnTransactionLifecycleEvent() 方法也返回 false,表示不监听事务生命周期事件。 要将全局监听器注册到流程引擎配置中,可以使用以下代码: ```java ProcessEngineConfiguration config = ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault(); config.setAsyncExecutorActivate(false); List<FlowableEventListener> eventListeners = new ArrayList<>(); eventListeners.add(new MyGlobalEventListener()); config.setEventListeners(eventListeners); ``` 在上面的示例中,将 MyGlobalEventListener 添加到 eventListeners 列表中,并将列表设置为流程引擎配置的事件监听器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值