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

新手上路,请多包涵

我正在编写一些重新连接逻辑,以定期尝试建立与出现故障的远程端点的连接。本质上,代码如下所示:

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

        establishConnection();
    }
}

我已经多次使用与上述类似的代码解决了这个普遍问题,但我对结果感到很不满意。是否有专为处理此问题而设计的设计模式?

原文由 Naftuli Kay 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 307
1 个回答

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

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

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

然后您可以使用 Retryer 执行一个可调用(或多个):

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

原文由 JB Nizet 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题