Исключения, а как лучше всего повторить попытку при сбросе соединения? - PullRequest
8 голосов
/ 16 ноября 2010

У меня есть код, который подключается к 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);
  }
} 

Ответы [ 3 ]

3 голосов
/ 16 ноября 2010

Это тот тип вещей, который я бы предпочел, чтобы пул защищенных пулов соединений обрабатывал для меня, а не писал сам.

1 голос
/ 16 ноября 2010

Мне показалось, что проглатывать исключение всегда плохо, но я думаю, что это единственный способ узнать, действительно ли было установлено соединение.Я предполагаю, что вы обрабатываете исключение в соответствии с вашими требованиями, так что это все вопросы.

Но я бы сделал так, чтобы вы не проглотили последнее исключение.Если трижды произойдет сбой, вы захотите сбросить это исключение или каким-либо образом изящно завершить работу.

0 голосов
/ 03 февраля 2013

AOP и Java аннотации должны помочь.Я бы порекомендовал механизм чтения из jcabi-aspect (я разработчик):

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

Вы также можете попробовать RetryFunc из Cactoos .

...