有时候项目里会自定义异常来处理一些逻辑上的特定问题,此时可以利用通过通用异常的捕捉filter来对所有的dubbo接口进行统一处理。
具体的filter代码如下:
自定义的filter需要继承ListenableFilter。
@Activate
@Slf4j
public class DubboFilter extends ListenableFilter{
public DubboFilter() {
super.listener = new DubboFilter.ExceptionListener();
}
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
return invoker.invoke(invocation);
}
static class ExceptionListener implements Listener {
@Override
public void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {
if (appResponse.hasException() && GenericService.class != invoker.getInterface()) {
try {
Throwable exception = appResponse.getException();
if (exception instanceof ServiceException) {
R response = ((ServiceException) exception).getResult();
appResponse.setValue(response);
appResponse.setException(null);
return;
}
if (exception instanceof RpcException) {
appResponse.setValue(exception.getMessage());
appResponse.setException(null);
return;
}
} catch (Throwable e) {
return;
}
}
}
@Override
public void onError(Throwable t, Invoker<?> invoker, Invocation invocation) {
}
}
}
里边的ServiceException是我自定义的异常类。这个R类也是我自定义的dubbo接口返回类,根据需要可以自行进行替换。其他异常类型则会原样抛出。
使用filter的步骤跟我上一篇文章里讲的一样,dubbo中的filter