例外,以及重置连接时如何最好重试?
我有一些代码连接到URL以下载文件,然后对其执行一些处理。 但是,有时我收到错误java.net.SocketException: Connection reset
。
我想在收到此错误时重试下载该文件,在放弃之前最多说3次。 我想知道什么是最好的结构方式。
以下是否正常。 将try-catch
块放在while
循环中似乎可以接受,还是有更好的方法?
非常感谢所有帮助!
while(!connected && retries > 0) { retries--; URL downloadUrl; URLConnection conn; try { downloadUrl = new URL(url); conn = downloadUrl.openConnection(); conn.connect(); connected = true; // Perform processing on downloaded file here } catch (IOException e) { Logger.batchLog(e); } }
我一直认为吞下exception总是很糟糕,但我想在这里,这是判断连接是否确实重置的唯一方法。 我猜你是根据你的要求处理exception,所以这就是所有问题。
但是,我会这样做,所以你不要吞下最后一个例外。 如果它失败三次,你会想要重新抛出该exception或以某种方式优雅地失败。
这是我宁愿让防弹连接池为我处理而不是自己编写的东西。
AOP和Java注释应该有所帮助。 我建议使用jcabi-aspects (我是开发人员)的读取机制:
@RetryOnFailure(attempts = 3, delay = 5) public String load(URL url) { return url.openConnection().getContent(); }
您也可以尝试使用RetryFunc
的RetryFunc 。