开发者社区 > 云原生 > 正文

关于自定义限流处理逻辑中的坑

在wiki中有这样一句描述

【自定义限流触发后,默认的处理逻辑是抛出异常。 如果需要自定义处理逻辑,填写@SentinelResource注解的blockHandler和blockHandlerClass属性,指定后会去blockHandlerClass类里找对应的blockHandler静态方法】

但是这里并没有说明这个自定义静态方法的返回值类型与原始方法(originMethod)返回值之间的关系,坑就在这里,而且给的demo里正好就是这个坑,在sentinel-example中,hello方法的返回值是String类型,而自定义处理类ExceptionUtil中的静态方法blockHandler返回void,所以调试过程中发现,会抛出下面的异常信息

【Cannot find static method [blockHandler] in class [org.springframework.cloud.alibaba.cloud.examples.ExceptionUtil] with parameters [class com.alibaba.csp.sentinel.slots.block.BlockException]】

定位这个异常信息,发现在SentinelResourceAspect这个类的

private Method findMethod(boolean mustStatic, Class clazz, String name, Class returnType, Class<?>... parameterTypes)

方法返回null,经过跟踪,定位原因在returnType.isAssignableFrom(method.getReturnType()) 这个判断 这个isAssignableFrom是一个native方法,个人理解,只有a,b两个对象具有父子继承类或者接口关系或者二者完全相同的情况下才返回true吧,也就是说自定义异常处理方法的返回值和原始方法的返回值要么是父子关系,要么是同类型,不知道个人理解的是否正确,希望wiki中能把这个问题修改过来

原提问者GitHub用户lijhua

展开
收起
码字王 2023-05-19 19:39:10 120 0
1 条回答
写回答
取消 提交回答
  • 在 sentinel-demo-annotation-spring-aop 中,ExceptionUtil#handleException 方法是 test 方法的 blockHandler,不是 hello 方法的 blockHandler,见源码:

    @Override
    @SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})
    public void test() {
        System.out.println("Test");
    }
    
    @Override
    @SentinelResource(value = "hello", blockHandler = "exceptionHandler")
    public String hello(long s) {
        return String.format("Hello at %d", s);
    }
    

    原回答者GitHub用户sczyh30

    2023-05-19 22:46:41
    赞同 展开评论 打赏
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载