Exceptions, and how best to retry when a connection is reset?

旧巷老猫 提交于 2019-12-09 05:42:10

问题


I have some code which connects to a URL to download a file, and then performs some processing on it. However, sometimes I am receiving the error java.net.SocketException: Connection reset.

I would like to retry to download the file when I receive this error, say a maximum of 3 times before giving up on it. I would like to know what would be the best way to structure this.

Does the following look ok. Does it seem acceptable to place the try-catch block inside of a while loop, or is there a better approach?

All help is much appreciated!

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);
  }
} 

回答1:


I've been wired to think that swallowing an exception is always bad, but I think here, that's the only way to tell if the connection was indeed reset. I guess you are handling the exception according to your requirements, so that's all the matters.

But I would, however, make it so you don't swallow the last exception. If it fails three times, you'll want to rethrow that exception or fail gracefully somehow.




回答2:


This is the kind of thing that I'd rather let a bullet-proof connection pool handle for me rather than writing it myself.




回答3:


AOP and Java annotations should help. I would recommend a read-made mechanism from jcabi-aspects (I'm a developer):

@RetryOnFailure(attempts = 3, delay = 5)
public String load(URL url) {
  return url.openConnection().getContent();
}

You may also try RetryFunc from Cactoos.



来源:https://stackoverflow.com/questions/4198289/exceptions-and-how-best-to-retry-when-a-connection-is-reset

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!