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

相关文章

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

详解Python中通用工具类与异常处理

《详解Python中通用工具类与异常处理》在Python开发中,编写可重用的工具类和通用的异常处理机制是提高代码质量和开发效率的关键,本文将介绍如何将特定的异常类改写为更通用的ValidationEx... 目录1. 通用异常类:ValidationException2. 通用工具类:Utils3. 示例文

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)