sentinel熔断报java.lang.reflect.UndeclaredThrowableException

背景:内部要进行应用jdk&springboot升级,因此也需要将Spring Cloud Hystrix 替换成alibaba sentinel。

依赖

XML 复制代码
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
   <version>2022.0.0.0-RC2</version>
</dependency>

<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-datasource-nacos</artifactId>
  <version>1.8.6</version>
</dependency>

开启Feign对Sentinel的支持

sentinel官方文档

出现错误日志时的代码

java 复制代码
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @Author: WeiXiang
 * @Desc:
 * @Date: Create in 5:09 PM on 2020/6/23.
 */
@FeignClient(value = "messageCenter", path = "/messageCenter/cloudService")
public interface JobApplyRest {

    /**
     * 获取用户最近的报名兼职list
     *
     * @desc:
     * @author: WeiXiang
     * @date: 9:04 PM 2020/6/23
     */
    @PostMapping("/userLastMonthApplyPartJob")
    String userLastMonthApplyPartJob(@RequestParam("userId") Long userId, @RequestParam("size") Integer size);
}

当达到熔断条件时,则抛出以下错误信息

错误被解决后的代码

解决方案:在FeignClient上,配置自定义fallback熔断降级处理方法

java 复制代码
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @Author: WeiXiang
 * @Desc:
 * @Date: Create in 5:09 PM on 2020/6/23.
 */
@FeignClient(value = "messageCenter", path = "/messageCenter/cloudService", fallback = JobApplyRestFallback.class)
public interface JobApplyRest {

    /**
     * 获取用户最近的报名兼职list
     *
     * @desc:
     * @author: WeiXiang
     * @date: 9:04 PM 2020/6/23
     */
    @PostMapping("/userLastMonthApplyPartJob")
    String userLastMonthApplyPartJob(@RequestParam("userId") Long userId, @RequestParam("size") Integer size);
}

JobApplyRestFallback类

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * @description: 报名单服务容错类
 * @author: jiusi
 * @create: 2023-09-01 10:23:47
 */
@Service
@Slf4j
public class JobApplyRestFallback implements JobApplyRest{
    @Override
    public String userLastMonthApplyPartJob(Long userId, Integer size) {
        log.warn("熔断降级开启JobApplyRest#userLastMonthApplyPartJob:userId:{}", userId);
        return null;
    }
}

至此,java.lang.reflect.UndeclaredThrowableException 错误被解决。

问题原因:

sentinel通过代理实现熔断降级,当达到设置的阈值条件时,内部就抛出的自定义受检异常 。但该受检异常并未在被代理对象接口定义中进行声明(即:Rest feignClient为被代理对象 ),那么这个异常就会被JVM包装成UndeclaredThrowableException进行抛出。

相关推荐
杨凯凡4 分钟前
【014】基本类型与包装类:缓存、相等性、NPE
java·数据结构·缓存
MateCloud微服务33 分钟前
懂你所需,利爪随行:MateClaw 正式开源,补齐 Java 生态的 AI Agent 拼图
spring boot·aigc·javaagent·aiagent·openclaw·mateclaw·javaclaw
emmjng36934 分钟前
使用飞算JavaAI实现在线图书借阅平台
java
CoderYanger37 分钟前
14届蓝桥杯省赛Java A 组Q1~Q3
java·开发语言·线性代数·算法·职场和发展·蓝桥杯
钮钴禄·爱因斯晨38 分钟前
他到底喜欢我吗?赛博塔罗Java+前端实现,一键解答!
java·开发语言·前端·javascript·css·html
词元Max40 分钟前
Java 转 AI Agent 开发学习路线(2026年3月最新版)
java·人工智能·学习
亚历克斯神40 分钟前
Java 云原生开发最佳实践:构建现代化应用
java·spring·微服务
布说在见40 分钟前
企业级 Java 登录注册系统构建指南(附核心代码与配置)
java·开发语言
是宇写的啊40 分钟前
SpringBoot配置文件
java·spring boot·spring
草莓熊Lotso41 分钟前
一文读懂 Java 主流编译器:特性、场景与选择指南
java·开发语言·经验分享