当前位置: 首页 > 知识库问答 >
问题:

使用CompletionStage的Resilence4J重试

赵渊
2023-03-14
    private CompletionStage<org.asynchttpclient.Response> executeWithRetries(Request request) {
    RetryConfig retryConfig = RetryConfig.<org.asynchttpclient.Response>custom()
            .maxAttempts(5)
            .intervalFunction(IntervalFunction
                    .ofExponentialBackoff(TimeUnit.SECONDS.toMillis(2), 1.2))
            .build();
    Retry retry = Retry.of("proxy-retry" , retryConfig);
    Supplier<CompletionStage<org.asynchttpclient.Response>> retryableSupplier = Retry.decorateCompletionStage(
            retry , Executors.newScheduledThreadPool(10),  () -> executeCall(request));

    return retryableSupplier.get();
}

共有1个答案

花飞尘
2023-03-14

您可能在Supplier中抛出异常,而不是在Supplier.get()代码返回的future中抛出异常。我尝试了以下代码:

import java.util.concurrent.*;
import java.util.function.*;
import io.github.resilience4j.retry.*;

public class Main {
    private static final ScheduledExecutorService scheduledExecutorService =
            Executors.newScheduledThreadPool(10);

    public static void main(final String[] args) {
        RetryConfig retryConfig = RetryConfig.custom()
                .maxAttempts(5)
                .intervalFunction(
                        IntervalFunction.ofExponentialBackoff(10, 1.2))
                .build();

        Retry retry = Retry.of("proxy-retry", retryConfig);

        Supplier<CompletionStage<String>> supplier =
                () -> CompletableFuture.supplyAsync(() -> {
                    System.out.println("failing code");
                    throw new RuntimeException();
                });

        retry.executeCompletionStage(scheduledExecutorService, supplier);
    }
}

输出为:

failing code
failing code
failing code
failing code
failing code

不出所料!

 类似资料:
  • 如何配置spring以使用返回类型?考虑代码: 我得到了404,但我在日志中看到该方法被触发。如果我这样更改签名: 我看到成功的json阵列。 如何使与spring(4.2.RELEASE)配合使用? 更新 对于测试,我编写了以下方法: 而且很有效。面向对象 我测试了这个版本的future: 有点激动,但是。。。作品 所以我原来的方法有以下逻辑: 迭代集合 通过每个集合元素的AsyncRestTe

  • 我有许多服务,每一个服务都调用许多不同的远程endpoint,使用一个基本服务,即service1->base_service->endpoint1,2,5,service2->base_service->endpoint2,3,5等等。基本服务使用Spring WebClient进行http调用。

  • 目前,要用CompletionStage的集合做一些简单的事情,需要跨越几道丑陋的关卡: 我想写的是: 关于完成未来并转换为数组和连接的整个仪式都是样板文件,分散了对实际代码语义的注意力。 可能有一个版本的allOf()返回< code>Future 我可以自己尝试实现XXXUtil,但我想知道是否已经有一个成熟的3rdparty库来解决这个问题和类似的问题(例如Spotify的Completab

  • 我在他们每一个都看到了一个例子,但我需要确切地知道在深层上有什么不同,因为有时我认为我可以用他们两个得到相同的结果,所以我想知道,以便我可以选择正确的? 使用它们每一个都有什么好处? 这两个例子都起作用: 此示例运行在中。

  • 在构建API时,编写接口代码是一个很好的实践,因此返回CompletionStage似乎是一个最好的方法。然而,我意识到我碰巧总是在获得CompletionStage之后调用.ToCompletableFuture。在这种情况下,推荐的方法是什么?

  • 在使用回调结构和Quarkus/Mutiny实现反应式REST GETendpoint并使用阻塞服务检查变量后,我最终使用CompletionStage/CompletableFuture API版本进行了播放; 如何从我的Reactive REST GETendpoint调用CompletionLevel/CompletableFuture API服务