Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉

这篇具有很好参考价值的文章主要介绍了Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ProcessRuntimeEventListener

activiti7中,提供了ProcessRuntimeEventListener监听器,用于监听流程实例的结束事件

/**
 * 流程完成监听器
 */
@Slf4j
@Component
public class ProcessCompleteListener implements ProcessRuntimeEventListener<ProcessCompletedEvent> {

    @Override
    public void onEvent(ProcessCompletedEvent event) {
        // ...处理自己的业务逻辑
	
		// 这里写一段抛出异常的测试代码
		int a = 1 / 0;
    }
}

上述代码中,由于1/0会抛出运行时异常,理论上来说应该被我们的全局异常所捕获

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 通用未知异常
     */
    @ExceptionHandler(Throwable.class)
    @ResponseStatus(HttpStatus.OK)
    public ResultEntity<?> error(Exception e) {
        return ResultEntity.fail(ResultEnum.SERVER_ERROR, "系统错误,请联系管理员!");
    }

}

实际情况是无法捕获

解决思路

既然异常没有被一层一层的抛出去直到被全局异常捕获,那说明调用ProcessCompleteListener.onEvent()的某个地方使用try catch将异常捕获了该异常并没有继续向上抛出,随着这个思路,我们将断点打在1/0这行代码上面

Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉,spring,java,后端
然后重新运行代码,让代码执行到断点位置
Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉,spring,java,后端

然后在左侧的方法调用栈中,一个一个找,是哪个地方调用了onEvent并且进行了try catch异常捕捉
Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉,spring,java,后端
找到使用了try catch的实际的调用处,如图所示
catch中通过判断listener的isFailOnException()来控制是否抛出异常

由断点可以看出,listener对象是ProcessCompletedListenerDelegate
Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉,spring,java,后端
Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉,spring,java,后端
由此可见isFailOnException总是返回false,所以一直不会将异常抛出

解决办法

我们可以创建一个CustomProcessCompletedListenerDelegate自定义子类继承该类,然后重新isFailOnException方法,但是问题是如何将spring环境中的ProcessCompletedListenerDelegate替换成我们的自定义子类
那么我们就看ProcessCompletedListenerDelegate类是什么时候创建出来的,在创建时,替换成我们自定义的类

有2个办法:

  1. ProcessCompletedListenerDelegate类的构造器上面打断点(小提示:如果遇到想给构造器打断点,但是没有写构造器的情况下,就在类名所在行打断点),然后重启项目,等执行到断点行的时候,再次查看方法调用栈,找到什么时候创建的该类
  2. 直接alt + F7,或者右键类名点Find Usages查找使用地方

Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉,spring,java,后端

取巧一点的方法是先用方式2,看看使用的地方多不多,如果很多无法确定具体使用的地方,那么在用方法1

这里可以直接使用方法2,找到调用处
Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉,spring,java,后端

ProcessRunTimeAutoConfiguration的369行在使用,直接点进去

Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉,spring,java,后端

这就好办了,看到了@ConditionOnMissingBean,那么我们可以直接自己注入CustomProcessCompletedListenerDelegate到Spring中来管理就可以文章来源地址https://www.toymoban.com/news/detail-740629.html

解决代码如下

自定义监听器委托类CustomProcessCompletedListenerDelegate

/**
 * 继承ProcessCompletedListenerDelegate,重写isFailOnException以达目的
 */
public class CustomProcessCompletedListenerDelegate extends ProcessCompletedListenerDelegate {
    public CustomProcessCompletedListenerDelegate(List<ProcessRuntimeEventListener<ProcessCompletedEvent>> processRuntimeEventListeners, ToProcessCompletedConverter processCompletedConverter) {
        super(processRuntimeEventListeners, processCompletedConverter);
    }

    @Override
    public boolean isFailOnException() {
        return true;
    }
}

注入Spring,我这里使用的是SpringBoot

@Configuration
// 如果是spi方式注入,则添加如下这行控制顺序
// @AutoConfigureBefore(ProcessRuntimeAutoConfiguration.class)
public class ProcessCompleteListenerConfig {

    @Bean("registerProcessCompletedListenerDelegate")
    public InitializingBean registerProcessCompletedListenerDelegate(
            RuntimeService runtimeService,
            @Autowired(required = false) List<ProcessRuntimeEventListener<ProcessCompletedEvent>> eventListeners,
            ToProcessCompletedConverter converter) {
        return () -> runtimeService.addEventListener(new CustomProcessCompletedListenerDelegate(getInitializedListeners(eventListeners),
                        converter),
                ActivitiEventType.PROCESS_COMPLETED);
    }

    private <T> List<T> getInitializedListeners(List<T> eventListeners) {
        return eventListeners != null ? eventListeners : Collections.emptyList();
    }


}

到了这里,关于Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【工作流Activiti7】3、Activiti7 回退与会签

    1.  回退(驳回) 回退的思路就是动态更改节点的流向。先遇水搭桥,最后再过河拆桥。 具体操作如下: 取得当前节点的信息 取得当前节点的上一个节点的信息 保存当前节点的流向 新建流向,由当前节点指向上一个节点 将当前节点的流向设置为上面新建的流向 当前节点完

    2023年04月20日
    浏览(52)
  • Activiti7(图文并茂)

    Activiti 是由 jBPM (BPM,Business Process Management 即业务流程管理) 的创建者 Tom Baeyens 离开 JBoss 之后建立的项目,构建在开发 jBPM 版本 1 到 4 时积累的多年经验的基础之上,旨在创建下一代的 BPM 解 决方案。 Activiti 作为一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计

    2024年02月06日
    浏览(61)
  • activiti7入门教程

    工作流概念 工作流是指业务过程的部分或整体在计算机应用环境下的自动化。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。 activiti介绍 activiti是一个工作流引擎,可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN进行定义,业务流程按照

    2024年02月13日
    浏览(31)
  • 2023最新版本Activiti7系列-任务分配

      在指派 用户任务 的审批人时。我们是直接指派的固定账号。但是为了保证流程设计审批的灵活性。我们需要各种不同的分配方式,所以这节我们就详细的来介绍先在Activiti7中我们可以使用的相关的分配方式.   固定分配就是我们前面介绍的,在绘制流程图或者直接在流

    2024年02月09日
    浏览(41)
  • Java --- 云尚办公之Activiti7

    目录 一、工作流 1.1、什么是工作流  1.2、工作流引擎 1.3、常见工作流引擎 二、 Activiti7概述 2.1、Activiti介绍 2.2、建模语言BPMN 2.3、 Activiti使用流程 三、 Activiti使用 3.1、部署流程工具  3.2、画出流程图并放入项目中 3.3、流程定义部署 3.4、启动流程实例 3.5、查询任务 3.6、

    2024年02月06日
    浏览(62)
  • 2023最新版本Activiti7系列-身份服务

      在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。针对这种情况可以给任务设置多个候选人或者候选人组,可以从候选人中选择参与者来完成任务。

    2024年02月15日
    浏览(34)
  • 【工作流】Activiti工作流简介以及Spring Boot 集成 Activiti7

    什么是工作流? 工作流指通过计算机对业务流程进行自动化管理,实现多个参与者按照预定义的流程去自动执行业务流程。 文章源码托管:https://github.com/OUYANGSIHAI/Activiti-learninig Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、

    2024年02月08日
    浏览(53)
  • 若依微服务整合activiti7.1.0.M6

    放弃activiti7新版本封装的API,使用老版本的API,这种方式只需要直接集成即可,在7.1.0.M6版本中甚至不需要去除security的依赖。不多介绍,需要的可以私聊找我。 需要使用新版本的API,那就需要集成security,需要写一点代码实现security的集成。以下详细介绍这一种方式。 步骤

    2024年02月15日
    浏览(33)
  • 【业务功能篇36】Springboot+activiti7 工作流引擎

    业务场景:前段时间总结的有一个告警工单流程,我们都是直接自己建表,状态节点,操作节点,都是自定义设计的,而到后面会有很多的工单流程,比如创建一个遗留问题电子流,指定处理人进行分析闭环,等等多种电子流,后期重复的开发工作以及维护工作会越来越多。

    2024年02月12日
    浏览(51)
  • List list=new ArrayList()抛出的ArrayIndexOutOfBoundsException异常

    1.应用场景,今天生产日志监控到一组new ArrayList() 进行add 异常,具体日志如下: 具体代码: 上面代码是对ids 分片按照10条记录查询远程接口,并将结果集放到list riskSummaryList 对象中 riskSummaryList.add(new DTO() )最后输出结果,代码比较简单. 分析:这种情况属于多线程并发产生的

    2024年02月13日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包