Camel异常策略匹配逻辑

2024-04-25 18:32

本文主要是介绍Camel异常策略匹配逻辑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Camel异常策略匹配逻辑

  • route 优先级大于 context
  • 匹配逻辑
    • 注意区分包装与继承
    • 获取异常包装层级
    • 遍历异常匹配处理策略
    • 获取最终的匹配策略
  • 代码
  • Test Code

route 优先级大于 context

优先匹配 route 级别的异常策略, 然后匹配 context 级别的异常策略;

匹配逻辑

注意区分包装与继承

包装:ConnectException异常抛出后被包装成OrderFailedException异常,然后OrderFailedException异常又被包装成RuntimeCamelException异常,但是他们之间并不存在继承关系;

org.apache.camel.RuntimeCamelException (wrapper by Camel)
+ com.mycompany.OrderFailedException+ java.net.ConnectException

继承:而RuntimeCamelException继承RuntimeException异常,RuntimeException集成Exception异常

org.apache.camel.RuntimeCamelException
+ java.lang.RuntimeException+  java.lang.Exception

获取异常包装层级

以上述示例做参考,执行完该方法后,获取的异常列表为:

java.net.ConnectException
com.mycompany.OrderFailedException
org.apache.camel.RuntimeCamelException
public static Iterable<Throwable> createExceptionIterable(Throwable exception) {List<Throwable> throwables = new ArrayList<>();Throwable current = exception;// spool to the bottom of the caused by treewhile (current != null) {throwables.add(current);current = current.getCause();}// 此处有反转动作!!!Collections.reverse(throwables);return throwables;
}

遍历异常匹配处理策略

获取异常继承层级的递归算法:

private static int getInheritanceLevel(Class<?> clazz) {if (clazz == null || "java.lang.Object".equals(clazz.getName())) {return 0;}return 1 + getInheritanceLevel(clazz.getSuperclass());
}

判断异常与策略是否匹配的逻辑,以RuntimeCamelException异常匹配以下策略为例:

onException(Exception.class).maximumRedeliveries(1).redeliveryDelay(5000);

下述方法中,clazz 为 Exception.class, exception 为 RuntimeCamelException.class。

  • 首先,判断RuntimeCamelException是否为Exception的实例;
  • 然后,判断RuntimeCamelException与Exception是否为同一个类;
    • 如果是同一个类则为严格匹配;
    • 如果不为同一个类,则获取RuntimeCamelException与Exception之间的间隔层级
      • 如果间隔层级比现有的间隔层级小,则更新获选异常策略和异常层级信息
if (filter(type, clazz, exception)) {// must matchif (!matchesWhen(type, exchange)) {LOG.trace("The type did not match when: {}", type);continue;}// exact match then breakif (clazz.equals(exception.getClass())) {candidate = type;candidateDiff = 0;break;}// not an exact match so find the best candidateint level = getInheritanceLevel(clazz);int diff = targetLevel - level;if (diff < candidateDiff) {// replace with a much better candidatecandidate = type;candidateDiff = diff;}
}

获取最终的匹配策略

如果完全匹配则返回完全匹配的异常策略;
否则返回间隔层级小的异常策略;

代码

org.apache.camel.processor.errorhandler.DefaultExceptionPolicyStrategy#getExceptionPolicy

Test Code

@Test
public void testOnExceptionDirectMatch() throws Exception {context.addRoutes(new RouteBuilder() {@Overridepublic void configure() throws Exception {context.setTracing(true);onException(Exception.class).maximumRedeliveries(6);onException(OrderFailedException.class).maximumRedeliveries(3);from("direct:order").onException(Exception.class).maximumRedeliveries(10).end().bean(OrderServiceBean.class, "handleOrder");}});context.start();try {template.requestBody("direct:order", "ActiveMQ in Action");fail("Should throw an exception");Thread.sleep(10000l);} catch (CamelExecutionException e) {assertIsInstanceOf(OrderFailedException.class, e.getCause());}
}

在候选异常策略里包含两个异常策略,一个是完全匹配,来自global(camel context 级别),另外一个来自route(路由内配置);最终会选择严格匹配的OrderFailedException匹配策略。
在这里插入图片描述
最终结果输出如下:

handler order!
handler order!
handler order!
handler order!

这篇关于Camel异常策略匹配逻辑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935459

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组