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

相关文章

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

Java Exception异常类的继承体系详解

《JavaException异常类的继承体系详解》Java中的异常处理机制分为异常(Exception)和错误(Error)两大类,异常分为编译时异常(CheckedException)和运行时异常... 目录1. 异常类的继承体系2. Error错误3. Exception异常3.1 编译时异常: Che

MySQL数据库读写分离与负载均衡的实现逻辑

《MySQL数据库读写分离与负载均衡的实现逻辑》读写分离与负载均衡是数据库优化的关键策略,读写分离的核心是将数据库的读操作与写操作分离,本文给大家介绍MySQL数据库读写分离与负载均衡的实现方式,感兴... 目录读写分离与负载均衡的核心概念与目的读写分离的必要性与实现逻辑读写分离的实现方式及优缺点读负载均衡

Redis中删除策略的几种实现方式

《Redis中删除策略的几种实现方式》本文详细介绍了Redis的过期键删除策略和内存淘汰策略,过期键删除策略包括定时删除、惰性删除和定期删除,具有一定的参考价值,感兴趣的可以了解一下... 目录前言一、设计背景:为什么需要删除策略?二、第一类:过期键的 3 种核心删除策略1. 定时删除(Timed Dele

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.