diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyInvoker.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyInvoker.java index f9b6f0db82..871fe9672c 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyInvoker.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyInvoker.java @@ -86,8 +86,8 @@ public abstract class AbstractProxyInvoker implements Invoker { @Override public Result invoke(Invocation invocation) throws RpcException { + ProfilerEntry originEntry = null; try { - ProfilerEntry originEntry = null; if (ProfilerSwitch.isEnableSimpleProfiler()) { Object fromInvocation = invocation.get(Profiler.PROFILER_KEY); if (fromInvocation instanceof ProfilerEntry) { @@ -99,18 +99,6 @@ public abstract class AbstractProxyInvoker implements Invoker { Object value = doInvoke(proxy, invocation.getMethodName(), invocation.getParameterTypes(), invocation.getArguments()); - if (ProfilerSwitch.isEnableSimpleProfiler()) { - Object fromInvocation = invocation.get(Profiler.PROFILER_KEY); - if (fromInvocation instanceof ProfilerEntry) { - ProfilerEntry profiler = Profiler.release((ProfilerEntry) fromInvocation); - invocation.put(Profiler.PROFILER_KEY, profiler); - } - } - Profiler.removeBizProfiler(); - if (originEntry != null) { - Profiler.setToBizProfiler(originEntry); - } - CompletableFuture future = wrapWithFuture(value, invocation); CompletableFuture appResponseFuture = future.handle((obj, t) -> { AppResponse result = new AppResponse(invocation); @@ -133,7 +121,20 @@ public abstract class AbstractProxyInvoker implements Invoker { return AsyncRpcResult.newDefaultAsyncResult(null, e.getTargetException(), invocation); } catch (Throwable e) { throw new RpcException("Failed to invoke remote proxy method " + invocation.getMethodName() + " to " + getUrl() + ", cause: " + e.getMessage(), e); + } finally { + if (ProfilerSwitch.isEnableSimpleProfiler()) { + Object fromInvocation = invocation.get(Profiler.PROFILER_KEY); + if (fromInvocation instanceof ProfilerEntry) { + ProfilerEntry profiler = Profiler.release((ProfilerEntry) fromInvocation); + invocation.put(Profiler.PROFILER_KEY, profiler); + } + } + Profiler.removeBizProfiler(); + if (originEntry != null) { + Profiler.setToBizProfiler(originEntry); + } } + } private CompletableFuture wrapWithFuture(Object value, Invocation invocation) {