在 Java 中延迟重试的最佳方法

ann*_*iid 6 java

在我的程序中,我调用了一个可以返回值或“”的方法,基本上我希望它重试查找值 3 次,每次尝试之间延迟 1 秒,直到它获得一个值或尝试完成。

这就是我目前拥有的,但我觉得这个解决方案非常糟糕,尤其是必须将 try/catch 放在睡眠中。有谁知道延迟重试的更好方法?

public void method(String input){
    String value = getValue(input);

    int tries = 0
    while (value.equals("") && tries < 3){
        try { 
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            log.error("Thread interrupted");
        }
        value = getValue(input);
        tries += 1;
    }

    return value;
}
Run Code Online (Sandbox Code Playgroud)

Sca*_*bat 5

归根结底,您无法回避需要捕获异常的事实

你可以做的就是通过放入你自己的方法来隐藏它

public static void mySleep (int val) {
    try { 
        TimeUnit.SECONDS.sleep(val);
    } catch (InterruptedException e) {
        log.error("Thread interrupted");
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你的main功能变得更干净

while (value.equals("") && tries < 3){
    mySleep (1);
    value = getValue(input);
    tries += 1;
}
Run Code Online (Sandbox Code Playgroud)


Gon*_*heu 5

等待的固定轮询间隔功能可能会有所帮助:

Awaitility.with()
  .pollInterval(1, SECONDS)
  .atMost(3, SECONDS)
  .await()
  .until(() -> ("" != getValue(input)));
Run Code Online (Sandbox Code Playgroud)

它提供了一个用于同步异步操作的流畅接口。