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>