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小时内删除。
发表评论