问题:在使用@SentinelResource中的blockHandler时,一直报:com.alibaba.csp.sentinel.slots.block.flow.FlowException: null
问题代码:
@GetMapping("/testZhuJie")
@SentinelResource(value = "testZhuJie",blockHandler = "failBlockHandler")
@ResponseBody
public String testZhuJie(){
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
/**blockHandler 函数会在原方法被限流/降级/系统保护的时候调用*****/
@ResponseBody
public String failBlockHandler(HttpServletRequest request,BlockException be) {
return "您访问的太频繁了,请稍后再试!";
}
原因:
blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
官方文档截图如下:
修改代码:
@GetMapping("/testZhuJie")
@SentinelResource(value = "testZhuJie",blockHandler = "failBlockHandler")
@ResponseBody
public String testZhuJie(){
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
/**blockHandler 函数会在原方法被限流/降级/系统保护的时候调用*****/
@ResponseBody
public String failBlockHandler(BlockException be) {
return "您访问的太频繁了,请稍后再试!";
}
再次访问测试就可以了:
版权声明:本文为qq_41451744原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。