diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/stub/StubInvocationUtil.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/stub/StubInvocationUtil.java index 4e88fb780e..cb5232744f 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/stub/StubInvocationUtil.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/stub/StubInvocationUtil.java @@ -33,7 +33,13 @@ public class StubInvocationUtil { public static void unaryCall(Invoker invoker, MethodDescriptor method, T request, StreamObserver responseObserver) { - call(invoker, method, new Object[]{request, responseObserver}); + try { + Object res = unaryCall(invoker, method, request); + responseObserver.onNext((R) res); + } catch (Exception e) { + responseObserver.onError(e); + } + responseObserver.onCompleted(); } public static StreamObserver biOrClientStreamCall(Invoker invoker, diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/stub/StubInvocationUtilTest.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/stub/StubInvocationUtilTest.java index 476911f5f9..e5196f3237 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/stub/StubInvocationUtilTest.java +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/stub/StubInvocationUtilTest.java @@ -136,13 +136,8 @@ class StubInvocationUtilTest { Result result = Mockito.mock(Result.class); String response = "response"; when(invoker.invoke(any(Invocation.class))) - .then(invocationOnMock -> { - Invocation invocation = (Invocation) invocationOnMock.getArguments()[0]; - StreamObserver observer = (StreamObserver) invocation.getArguments()[1]; - observer.onNext(response); - observer.onCompleted(); - return result; - }); + .then(invocationOnMock -> result); + when(result.recreate()).thenReturn(response); MethodDescriptor method = Mockito.mock(MethodDescriptor.class); when(method.getParameterClasses()) .thenReturn(new Class[]{String.class}); diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java index c6a534d333..ce2ee44066 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java @@ -196,35 +196,15 @@ public class TripleInvoker extends AbstractInvoker { RequestMetadata request = createRequest(methodDescriptor, invocation, timeout); final Object pureArgument; - if (methodDescriptor.getParameterClasses().length == 2 - && methodDescriptor.getParameterClasses()[1].isAssignableFrom( - StreamObserver.class)) { - StreamObserver observer = (StreamObserver) invocation.getArguments()[1]; - future.whenComplete((r, t) -> { - if (t != null) { - observer.onError(t); - return; - } - if (r.hasException()) { - observer.onError(r.getException()); - return; - } - observer.onNext(r.getValue()); - observer.onCompleted(); - }); + + if (methodDescriptor instanceof StubMethodDescriptor) { pureArgument = invocation.getArguments()[0]; - result = new AsyncRpcResult(CompletableFuture.completedFuture(new AppResponse()), - invocation); } else { - if (methodDescriptor instanceof StubMethodDescriptor) { - pureArgument = invocation.getArguments()[0]; - } else { - pureArgument = invocation.getArguments(); - } - result = new AsyncRpcResult(future, invocation); - result.setExecutor(callbackExecutor); - FutureContext.getContext().setCompatibleFuture(future); + pureArgument = invocation.getArguments(); } + result = new AsyncRpcResult(future, invocation); + FutureContext.getContext().setCompatibleFuture(future); + result.setExecutor(callbackExecutor); ClientCall.Listener callListener = new UnaryClientCallListener(future); final StreamObserver requestObserver = call.start(request, callListener);