在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
在 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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。