dubbo自定义异常统一处理

发布时间:2018-03-22编辑:caoww阅读(902)

dubbo接口统一异常处理的两种方式


第一种方法: dubbo提供了Filter接口,我们只需集成Filter接口实现invoke方法即可。

@Activate(group= Constants.PROVIDER)
public class ExceptionFilter implements Filter{
    private static final Logger logger = LogManager.getLogger(ExceptionFilter.class);
    
    public Result invoke(Invoke<?> invoker, Invocation invocation){
        Result result = null;
        try{
        result = invoker.invoke(invocation);
        if(result.hasException() && GenericService.class !=invoker.getInterface()){
            Throwable exception = result.getException();
            String data = String.format("\r\n[level]:Error,[createTime]:%s,[platform]:%s,[serviceName]:%s,[methodNmae]:%s,[imputParam]:%s",
            DateUtil.formatDateTime(new Date()),PlatformNameEnum.PAY,invoker.getInterface().getName().invocation.getMethodName(),JSON.toJSONString(invocation.getArguments()));
        
            logger.error(data,exception);
            ResultVo resultVo = new ResultVo(false);
            resultVo.setResultCode(PayCenterErrorCodeEnum.PAY_ERR_1000000.getCode());
            resultVo.setResultMessage(PayCenterErrorCodeEnum.Pay_ERR_1000000.getMsg())
            //出现异常
            return new  RpcREsult(resultVo);
        }
        
        }catch(){
        String data = String.format("\r\n[level]:Error,[createTime]:%s,[platform]:%s,[serviceName]:%s,[methodName]:%s,[inputParam]:%s", DateUtil.formatDateTime(new Date()), PlatformNameEnum.PAY, invoker.getInterface().getName(), invocation.getMethodName(), JSON.toJSONString(invocation.getArguments()));21             logger.error(data, e);
        }
        return result;
    }
}
            2、在resources目录下添加纯文本文件META-INF/dubbo/com.alibaba.dubbo.rpc.Filter,内容如下:
   
          exception\=com.zcz.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代码    
public class ExceptionAop {
    private static final Logger logger = LogManager.getLogger(ExceptionAop.class);

    public Object handlerControllerMethod(ProceedingJoinPoint pjp) {
        long startTime = System.currentTimeMillis();

        ResultVo result;

        try {
            result = (ResultVo) pjp.proceed();
            logger.info(pjp.getSignature() + "use time:" + (System.currentTimeMillis() - startTime));
        } catch (Throwable e) {
            result = handlerException(pjp, e);
        }

        return result;
    }

    private ResultVo handlerException(ProceedingJoinPoint pjp, Throwable e) {
        ResultVo result = new ResultVo(false);
        pjp.getArgs();

        // 已知异常
        if (e instanceof BusinessException) {
            result.setResultCode(Integer.parseInt(((BusinessException) e).getExceptionCode()));
            result.setResultMessage(((BusinessException) e).getExceptionMsg());
        } else {
            logger.error(pjp.getSignature() + " error ", e);

            //TODO 未知的异常,应该格外注意,可以发送邮件通知等
            result.setResultCode(PayCenterErrorCodeEnum.PAY_ERR_100000.getCode());
            result.setResultMessage(PayCenterErrorCodeEnum.PAY_ERR_100000.getMsg());
        }

        return result;
    }
}
    3、配置Spring Aop的XML

<bean id="exceptionAop" class="com.zcz.pay.aop.ExceptionAop"/>

    <aop:config>

        <aop:pointcut id="target"

                      expression="execution(* com.zcz.pay.api..*.*(..))"/>

        <aop:aspect id="myAop" ref="exceptionAop">

            <!-- 配置环绕通知 -->

            <aop:around method="handlerControllerMethod" pointcut-ref="target"/>

        </aop:aspect>

    </aop:config>




标签

评论