You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by il...@apache.org on 2019/01/11 07:41:33 UTC
[incubator-dubbo] branch 2.7.0-release updated: [Dubbo-3169]Check
future status before get(),
return default value if not completed yet. (#3185)
This is an automated email from the ASF dual-hosted git repository.
iluo pushed a commit to branch 2.7.0-release
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
The following commit(s) were added to refs/heads/2.7.0-release by this push:
new 031c011 [Dubbo-3169]Check future status before get(), return default value if not completed yet. (#3185)
031c011 is described below
commit 031c01199bba324f0a1acb80f7660403a8686122
Author: ken.lj <ke...@gmail.com>
AuthorDate: Fri Jan 11 15:41:28 2019 +0800
[Dubbo-3169]Check future status before get(), return default value if not completed yet. (#3185)
* Announce AsyncRpcResult internally use only;
Check future status before get().
* Code review: simplify code
---
.../java/org/apache/dubbo/rpc/AsyncRpcResult.java | 38 +++++++++++++++++++---
.../org/apache/dubbo/rpc/SimpleAsyncRpcResult.java | 11 +++++++
2 files changed, 44 insertions(+), 5 deletions(-)
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java
index 76675bc..b631dff 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java
@@ -25,6 +25,34 @@ import java.util.concurrent.CompletionException;
import java.util.function.Function;
/**
+ * <b>NOTICE!!</b>
+ *
+ * <p>
+ * You should never rely on this class directly when using or extending Dubbo, the implementation of {@link AsyncRpcResult}
+ * is only a workaround for compatibility purpose. It may be changed or even get removed from the next major version.
+ * Please only use {@link Result} or {@link RpcResult}.
+ *
+ * Extending the {@link Filter} is one typical use case:
+ * <pre>
+ * {@code
+ * public class YourFilter implements Filter {
+ * @Override
+ * public Result onResponse(Result result, Invoker<?> invoker, Invocation invocation) {
+ * System.out.println("Filter get the return value: " + result.getValue());
+ * // Don't do this
+ * // AsyncRpcResult asyncRpcResult = ((AsyncRpcResult)result;
+ * // System.out.println("Filter get the return value: " + asyncRpcResult.getValue());
+ * return result;
+ * }
+ *
+ * @Override
+ * public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
+ * return invoker.invoke(invocation);
+ * }
+ * }
+ * }
+ * </pre>
+ * </p>
* TODO RpcResult can be an instance of {@link java.util.concurrent.CompletionStage} instead of composing CompletionStage inside.
*/
public class AsyncRpcResult extends AbstractResult {
@@ -119,15 +147,15 @@ public class AsyncRpcResult extends AbstractResult {
}
public Result getRpcResult() {
- Result result;
try {
- result = resultFuture.get();
+ if (resultFuture.isDone()) {
+ return resultFuture.get();
+ }
} catch (Exception e) {
// This should never happen;
- logger.error("", e);
- result = new RpcResult();
+ logger.error("Got exception when trying to fetch the underlying result from AsyncRpcResult.", e);
}
- return result;
+ return new RpcResult();
}
@Override
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/SimpleAsyncRpcResult.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/SimpleAsyncRpcResult.java
index 49a492b..98e42d9 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/SimpleAsyncRpcResult.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/SimpleAsyncRpcResult.java
@@ -20,6 +20,17 @@ import java.util.concurrent.CompletableFuture;
/**
* A sub class used for normal async invoke.
+ *
+ * <b>NOTICE!!</b>
+ *
+ * <p>
+ * You should never rely on this class directly when using or extending Dubbo, the implementation of {@link SimpleAsyncRpcResult}
+ * is only a workaround for compatibility purpose. It may be changed or even get removed from the next major version.
+ * Please only use {@link Result} or {@link RpcResult}.
+ * </p>
+ *
+ * Check {@link AsyncRpcResult} for more details.
+ *
* TODO AsyncRpcResult, AsyncNormalRpcResult should not be a parent-child hierarchy.
*/
public class SimpleAsyncRpcResult extends AsyncRpcResult {