This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/master by this push: new 6d1afb4 Fix RpcContext.asyncCall return when throw RpcException (#5607) 6d1afb4 is described below commit 6d1afb440768f51caf1a2190a08e182868c5a66f Author: Mark <mr3.s...@gmail.com> AuthorDate: Sun Feb 9 12:53:15 2020 +0800 Fix RpcContext.asyncCall return when throw RpcException (#5607) Fix #5606 --- .../main/java/org/apache/dubbo/rpc/RpcContext.java | 34 ++-------------------- .../java/org/apache/dubbo/rpc/RpcContextTest.java | 24 +++++++++++++-- 2 files changed, 25 insertions(+), 33 deletions(-) diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcContext.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcContext.java index f3792b0..bc57104 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcContext.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcContext.java @@ -30,10 +30,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE; import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE; @@ -681,34 +678,9 @@ public class RpcContext { removeAttachment(ASYNC_KEY); } } catch (final RpcException e) { - return new CompletableFuture<T>() { - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return false; - } - - @Override - public boolean isCancelled() { - return false; - } - - @Override - public boolean isDone() { - return true; - } - - @Override - public T get() throws InterruptedException, ExecutionException { - throw new ExecutionException(e.getCause()); - } - - @Override - public T get(long timeout, TimeUnit unit) - throws InterruptedException, ExecutionException, - TimeoutException { - return get(); - } - }; + CompletableFuture<T> exceptionFuture = new CompletableFuture<>(); + exceptionFuture.completeExceptionally(e); + return exceptionFuture; } return ((CompletableFuture<T>) getContext().getFuture()); } diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/RpcContextTest.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/RpcContextTest.java index df06aec..3b6dd0e 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/RpcContextTest.java +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/RpcContextTest.java @@ -17,12 +17,13 @@ package org.apache.dubbo.rpc; import org.apache.dubbo.common.URL; - import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; public class RpcContextTest { @@ -149,10 +150,29 @@ public class RpcContextTest { Assertions.assertTrue(rpcContext.isAsyncStarted()); asyncContext.write(new Object()); - Assertions.assertTrue(((AsyncContextImpl)asyncContext).getInternalFuture().isDone()); + Assertions.assertTrue(((AsyncContextImpl) asyncContext).getInternalFuture().isDone()); rpcContext.stopAsync(); Assertions.assertTrue(rpcContext.isAsyncStarted()); } + @Test + public void testAsyncCall() { + CompletableFuture<String> rpcFuture = RpcContext.getContext().asyncCall(() -> { + throw new NullPointerException(); + }); + + rpcFuture.whenComplete((rpcResult, throwable) -> { + System.out.println(throwable.toString()); + Assertions.assertNull(rpcResult); + Assertions.assertTrue(throwable instanceof RpcException); + Assertions.assertTrue(throwable.getCause() instanceof NullPointerException); + }); + + Assertions.assertThrows(ExecutionException.class, rpcFuture::get); + + rpcFuture = rpcFuture.exceptionally(throwable -> "mock success"); + + Assertions.assertEquals("mock success", rpcFuture.join()); + } }