开发者社区 > 云原生 > 中间件 > 正文

在Apache Dubbo如果希望异步也能重试,该如何配置呢?

在运行Apache Dubbo-samples/2-advanced/dubbo-samples-async/dubbo-samples-async-simple-boot 例子遇到一个问题,在异步调用时,服务端超时情况下,添加的重试配置没有生效。

@DubboReference(timeout = 500, retries = 3)
private HiService hiService;

CompletableFuture<String> f = RpcContext.getContext().asyncCall(() -> hiService.sayHello("async call request"));
System.out.println("async call invoked");
String result = Futures.getUnchecked(f);

看代码是 AbstractInvoker#invoke 中同步的timeout异常会被 FailoverClusterInvoker catch从而触发重试调用。但是这种情况异步没有异常。

在Apache Dubbo如果希望异步也能重试,该如何配置呢?

展开
收起
三分钟热度的鱼 2023-11-15 18:55:20 83 0
1 条回答
写回答
取消 提交回答
  • 在Dubbo中,异步调用在失败时不会自动重试,因为异步调用本身就是为了避免阻塞而设计的。如果你希望在异步调用失败时也进行重试,你需要在你的业务逻辑中实现这种逻辑。

    以下是一个简单的示例,展示了如何在异步调用失败时进行重试:

    public class RetryExample {
    
        private static final int MAX_RETRIES = 3;
    
        @DubboReference(timeout = 500)
        private HiService hiService;
    
        public void asyncRetryExample() {
            int retries = 0;
            while (retries < MAX_RETRIES) {
                CompletableFuture<String> f = RpcContext.getContext().asyncCall(() -> {
                    if (retries > 0) {
                        // 如果需要进行重试,可以在异步调用之前添加一些自定义的逻辑,比如等待一段时间
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    return hiService.sayHello("async call request");
                });
    
                try {
                    String result = Futures.getUnchecked(f);
                    System.out.println("async call succeeded, result: " + result);
                    break;
                } catch (ExecutionException e) {
                    if (retries < MAX_RETRIES) {
                        System.out.println("async call failed, retrying...");
                        retries++;
                    } else {
                        System.out.println("async call failed after " + MAX_RETRIES + " retries");
                    }
                }
            }
        }
    }
    

    在这个示例中,我们在异步调用失败时会进行重试,直到达到最大重试次数。你可以根据你的需求修改这个示例,以满足你的实际需求。

    2023-11-17 10:56:20
    赞同 展开评论 打赏

为企业提供高效、稳定、易扩展的中间件产品。

相关电子书

更多
Apache Flink技术进阶 立即下载
Apache Spark: Cloud and On-Prem 立即下载
Hybrid Cloud and Apache Spark 立即下载

相关镜像