“重试”逻辑的设计模式失败了?

2022-08-31 14:22:00

我正在编写一些重新连接逻辑,以定期尝试与已关闭的远程终结点建立连接。从本质上讲,代码如下所示:

public void establishConnection() {
    try {
        this.connection = newConnection();
    } catch (IOException e) {
        // connection failed, try again.
        try { Thread.sleep(1000); } catch (InterruptedException e) {};

        establishConnection();
    }
}

我已经多次使用类似于上述的代码解决了这个一般问题,但我对结果感到非常满意。是否有设计用于处理此问题的设计模式?


答案 1

无耻插件:我已经实现了一些类来允许重试操作。该库尚未可用,但您可以在github上对其进行分叉。一个分叉是存在的。

它允许使用各种灵活的策略构建重试器。例如:

Retryer retryer = 
    RetryerBuilder.newBuilder()
                  .withWaitStrategy(WaitStrategies.fixedWait(1, TimeUnit.SECOND))
                  .withStopStrategy(StopStrategies.stopAfterAttempt(3))
                  .retryIfExceptionOfType(IOException.class)
                  .build();

然后,您可以使用重试器执行一个可调用的(或多个):

retryer.call(new Callable<Void>() {
    public Void call() throws IOException {
        connection = newConnection();
        return null;
    }
}

答案 2

您可以尝试幂等重试模式

enter image description here


推荐