Sentinel icon indicating copy to clipboard operation
Sentinel copied to clipboard

sentinel-apache-dubbo-adapter 在异步模式下永远取不到异常

Open JasonMing opened this issue 4 years ago • 2 comments

代码:

https://github.com/alibaba/Sentinel/blob/4498de480f368d6bf63afbfda42797172c89573b/sentinel-adapter/sentinel-dubbo-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/dubbo/SentinelDubboProviderFilter.java#L73

在 dubbo 2.7.5 后,所有Filter均支持异步操作,返回的 Result 对象通常是 AsyncRpcResult,对 AsyncRpcResult 调用hasException() 时如果异步任务未完成,则使用默认的返回值,永远不包含异常。

https://github.com/apache/dubbo/blob/9c49efeacfd87d2d4409fb000cebd58e1114ec8a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java#L143-L155

JasonMing avatar Aug 09 '21 10:08 JasonMing

I'll fix it

wangchengming666 avatar Oct 27 '21 13:10 wangchengming666

syncInvoke
....
           Result result = invoker.invoke(invocation);
            // 异步 result
            if (result instanceof AsyncRpcResult){
                Entry finalInterfaceEntry = interfaceEntry;
                Entry finalMethodEntry = methodEntry;
                result.whenCompleteWithContext((r,t)->{
                    Throwable error = t;
                    if (error == null) {
                        error = Optional.ofNullable(r).map(Result::getException).orElse(null);
                        Tracer.traceEntry(error, finalInterfaceEntry);
                        Tracer.traceEntry(error, finalMethodEntry);
                    }
                    if (finalMethodEntry != null) {
                        finalMethodEntry.exit(1, invocation.getArguments());
                    }
                    if (finalInterfaceEntry != null) {
                        finalInterfaceEntry.exit();
                    }
                });
                methodEntry = null;
                interfaceEntry = null;
            }else if (result instanceof AppResponse){
                // 同步result
                if (result.hasException()) {
                    Tracer.traceEntry(result.getException(), interfaceEntry);
                    Tracer.traceEntry(result.getException(), methodEntry);
                }
            }
            return result;

liufeiyu1002 avatar Aug 04 '22 03:08 liufeiyu1002