dubbo接⼝统⼀异常处理的两种⽅式
  使⽤java开发没多久,对java体系的⼀些东西还不太熟悉。在项⽬开发过程中发现dubbo接⼝每个⽅法⾥都有⼀个try-catch的判断,都是⼀些重复性的⼯作,就想着能不能统
⼀处理这些异常,了⼀些资料果然可以,下⾯总结⼀下了解到的两种dubbo接⼝统⼀异常处理的⽅法⽅便以后查阅:java dubbo
  第⼀种⽅法:dubbo提供了Filter接⼝,我们只需继承Filter接⼝实现invoke⽅法即可。
    1、实现Filter接⼝,实现invoke⽅法
1 @Activate(group = Constants.PROVIDER)
2public class ExceptionFilter implements Filter {
3private static final Logger logger = Logger(ExceptionFilter.class);
4
5public Result invoke(Invoker<?> invoker, Invocation invocation) {
6        Result result = null;
7try {
8            result = invoker.invoke(invocation);
9if (result.hasException() && GenericService.class != Interface()) {
10                Throwable exception = Exception();
11                String data = String.format("\r\n[level]:Error,[createTime]:%s,[platform]:%s,[serviceName]:%s,[methodName]:%s,[inputParam]:%s", DateUtil.formatDateTime(new Date()), PlatformNameEnum.PAY, Interface().get
12                (data, exception);
13                ResultVo resultVo = new ResultVo(false);
14                resultVo.setResultCode(PayCenterErrorCodeEnum.PAY_Code());
15                resultVo.setResultMessage(PayCenterErrorCodeEnum.PAY_Msg());
16//出现异常,打印⽇志后返回错误码
17return new RpcResult(resultVo);
18            }
19        } catch (RuntimeException e) {
20            String data = String.format("\r\n[level]:Error,[createTime]:%s,[platform]:%s,[serviceName]:%s,[methodName]:%s,[inputParam]:%s", DateUtil.formatDateTime(new Date()), PlatformNameEnum.PAY, Interface().getNa
21            (data, e);
22        }
23return result;
24    }
25 }
    2、在resources⽬录下添加纯⽂本⽂件META-INF/dubbo/com.alibaba.dubbo.rpc.Filter,内容如下:
     filter.ExceptionFilter
  3、修改dubbo的provider配置⽂件,在dubbo:provider中添加配置的filter,如下:
   <dubbo:provider filter="exceptionFilter"></dubbo:provider>
  第⼆种⽅法:aop拦截
    1、引⼊aop相关的jar包
     spring-aop、spring-aspects、aspectjrt
    2、编写统⼀异常处理AOP代码
1public class ExceptionAop {
2private static final Logger logger = Logger(ExceptionAop.class);
3
4public Object handlerControllerMethod(ProceedingJoinPoint pjp) {
5long startTime = System.currentTimeMillis();
6
7        ResultVo result;
8
9try {
10            result = (ResultVo) pjp.proceed();
11            logger.Signature() + "use time:" + (System.currentTimeMillis() - startTime));
12        } catch (Throwable e) {
13            result = handlerException(pjp, e);
14        }
15
16return result;
17    }
18
19private ResultVo handlerException(ProceedingJoinPoint pjp, Throwable e) {
20        ResultVo result = new ResultVo(false);
21        Args();
22
23// 已知异常
24if (e instanceof BusinessException) {
25            result.setResultCode(Integer.parseInt(((BusinessException) e).getExceptionCode()));
26            result.setResultMessage(((BusinessException) e).getExceptionMsg());
27        } else {
28            (Signature() + " error ", e);
29
30//TODO 未知的异常,应该格外注意,可以发送邮件通知等
31            result.setResultCode(PayCenterErrorCodeEnum.PAY_Code());
32            result.setResultMessage(PayCenterErrorCodeEnum.PAY_Msg());
33        }
34
35return result;
36    }
37 }
    3、配置Spring Aop的XML
1<bean id="exceptionAop" class="pay.aop.ExceptionAop"/>
2<aop:config>
3<aop:pointcut id="target"
4                      expression="execution(* pay.api..*.*(..))"/>
5<aop:aspect id="myAop" ref="exceptionAop">
6<!-- 配置环绕通知 -->
7<aop:around method="handlerControllerMethod" pointcut-ref="target"/>
8</aop:aspect>
9</aop:config>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。