在运行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如果希望异步也能重试,该如何配置呢?
在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");
}
}
}
}
}
在这个示例中,我们在异步调用失败时会进行重试,直到达到最大重试次数。你可以根据你的需求修改这个示例,以满足你的实际需求。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。