1.Filter 类
下方 filter 实现了,把业务的所有的异常包装成 RpcException。
这里把异常转化 StringUtils.toString(e),因为自定义异常,生产者存在,消费者可能不存在,会出现无法系列化的问题,所以使用 StringUtils.toString(e)。
跟 dubbo 的 ExceptionFilter,处理异常类似。
@Activate(group = {CommonConstants.PROVIDER})
public class MyDubboFilter extends ExceptionFilter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
try {
Result result = super.invoke(invoker, invocation);
if (result.hasException()) {
Throwable e = result.getException();
if (!(e instanceof RpcException)) {
result.setException(new RpcException(RpcException.BIZ_EXCEPTION, e.getMessage(),
new RuntimeException(StringUtils.toString(e))));
}
}
return result;
} catch (RpcException e) {
throw e;
} catch (Throwable e) {
throw new RpcException(e.getMessage(), e);
}
}
}
2.注册 Filter
在 resources 目录下增加 META-INF/dubbo/org.apache.dubbo.rpc.Filter 文件,内容如下:
dubboExceptionFilter=com.example.filter.MyDubboFilter