首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹性4j-重试:1.7.1-不重试websocket连接

弹性4j-重试:1.7.1-不重试websocket连接
EN

Stack Overflow用户
提问于 2021-12-13 08:12:29
回答 1查看 232关注 0票数 0

我正在尝试连接到一个远程websocket端点(在spring引导应用程序中),如果它抛出一个异常,我将使用弹性4j- retry v1.7.7和JDK 8重试连接。然而,弹性4j-重试尝试连接一次,如果失败,不要重试。我做错了什么,连接是在ApplicationReadyEvent上调用的。

代码语言:javascript
复制
    @Autowired
    private WsConnector connector;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        RetryConfig config = RetryConfig.custom()
                .maxAttempts(5)
                .waitDuration(Duration.ofSeconds(5))
                .build();

        RetryRegistry registry = RetryRegistry.of(config);
        Retry retry = registry.retry("retryableSupplier", config);

        CheckedFunction0<String> retryableSupplier = Retry.decorateCheckedSupplier(retry, connector::startConnection);
        try {
            System.out.println("retrying " + retryableSupplier.apply());
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

        Retry.EventPublisher publisher = retry.getEventPublisher();
        publisher.onRetry(event1 -> System.out.println(event1.toString()));
        publisher.onSuccess(event2 -> System.out.println(event2.toString()));
    }
代码语言:javascript
复制
    @Service
    public class WsConnector {
        public String startConnection() throws Exception {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            WSClient client = new WSClient();
            container.connectToServer(client, new URI("ws://viewpoint:8080/ping"));
            return "Connected";
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-13 10:59:37

以下代码起作用了,

代码语言:javascript
复制
     @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        RetryConfig config = RetryConfig.custom()
                .maxAttempts(5)
                .waitDuration(Duration.ofSeconds(5))
                .build();

        RetryRegistry registry = RetryRegistry.of(config);
        Retry retry = registry.retry("retryableSupplier", config);
        CheckedFunction0<String> checkedSupplier = Retry.decorateCheckedSupplier(retry, connector::startConnection);

        Retry.EventPublisher publisher = retry.getEventPublisher();
        publisher.onRetry(event1 -> System.out.println("Retrying: " + event1.toString()));
        publisher.onSuccess(event2 -> System.out.println("Retrying Success: " +event2.toString()));

        Try<String> result = Try.of(checkedSupplier).recover((throwable -> "I am recovered"));
        System.out.println("result: " + result);
    }

问题在于事件EventPublisher,但是在重试后我初始化了EventPublisher时,它是不可见的。因此,只要在启动重试之前对EventPublisher进行初始化,问题中的代码也将工作。我喜欢上面的代码更干净。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70331601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档