dubbo · 2024-12-23 0

dubbo Filter 使用

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