如何在Spring Retryable中使用exceptionExpression?含布尔函数用法
@Retryable的exceptionExpression多种使用方式
核心原理
exceptionExpression 是Spring Retry提供的基于SpEL表达式的条件判断机制,表达式返回true时触发重试,返回false时直接抛出异常、抑制重试。
常见使用方式
1. 基于异常消息匹配(你已尝试的方式)
直接通过异常的message属性做字符串匹配,比如仅当消息包含指定关键词时重试:
@Retryable( value = {Exception.class}, exceptionExpression = "#exception.message.contains('网络超时')" ) public void yourBusinessMethod() { // 业务逻辑实现 }
注:#exception是SpEL内置的当前异常变量,和#root指代的对象一致。
2. 调用自定义布尔函数控制重试
完全可以通过自定义布尔函数实现条件判断,这是更灵活的扩展方式:
- 先定义工具类,编写返回布尔值的判断方法:
public class RetryJudgeUtil { public static boolean isNeedRetry(Exception e) { // 自定义判断逻辑:可结合异常类型、消息、业务规则等 if (e instanceof ConnectException) { return true; // 需要重试 } if (e.getMessage() != null && e.getMessage().contains("不可重试")) { return false; // 抑制重试 } return false; } }
- 在
exceptionExpression中调用该静态方法:
@Retryable( value = {Exception.class}, exceptionExpression = "T(com.yourpackage.RetryJudgeUtil).isNeedRetry(#exception)" ) public void yourBusinessMethod() { // 业务逻辑实现 }
注:T()是SpEL的类型运算符,用于引用静态类的方法。
3. 基于异常属性的精准判断
结合异常的特定属性做条件判断,比如针对SQL异常的状态码:
@Retryable( value = {SQLException.class}, exceptionExpression = "#exception.sqlState == '08001'" ) public void dbOperation() { // 数据库操作逻辑 }
4. 结合方法参数做上下文判断
如果方法有入参,还可以结合参数信息做组合判断:
@Retryable( value = {Exception.class}, exceptionExpression = "#args[0].allowRetry() && #exception.message.contains('重试标识')" ) public void processRequest(RequestDTO request) { // 请求处理逻辑 }
注:#args[0]指代方法的第一个入参。
关键注意事项
- 表达式必须返回布尔值,否则会触发SpEL解析异常
- 自定义函数优先使用静态方法,避免实例化对象的额外开销
- 可通过
#root.cause访问异常的根原因,处理嵌套异常场景
内容的提问来源于stack exchange,提问作者Santanu Das
相关产品推荐
相关产品推荐

