例外,以及重置连接时如何最好重试?

我有一些代码连接到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 。