We have a number of situations where we need to retry a task n-times if it fails (sometimes with some form of back-off-before-retry logic). Generally, if an exception is thrown, the task should be retried up to the max-retry count.
Below is a simple & complete Java example which explains retry logic and callURL logic.
package com.crunchify.tutorials;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
/**
* @author Crunchify.com
*/
public class CrunchifyRetryNTimes {
public static void main(String[] args) {
// Execute this Program as it is once to get correct response.
// Change URL to
// https://crunchify.com/wp-content/uploads/code/json.sample2.txt to
// see retry logic in action..
String myURL = "https://crunchify.com/wp-content/uploads/code/json.sample.txt";
CrunchifyRetryOnExceptionStrategy retry = new CrunchifyRetryOnExceptionStrategy();
while (retry.shouldRetry()) {
try {
System.out.println("Requested URL:" + myURL);
StringBuilder sb = new StringBuilder();
URLConnection urlConn = null;
InputStreamReader in = null;
URL url = new URL(myURL);
urlConn = url.openConnection();
if (urlConn != null)
urlConn.setReadTimeout(60 * 1000);
if (urlConn != null && urlConn.getInputStream() != null) {
in = new InputStreamReader(urlConn.getInputStream(),
Charset.defaultCharset());
BufferedReader bufferedReader = new BufferedReader(in);
if (bufferedReader != null) {
int cp;
while ((cp = bufferedReader.read()) != -1) {
sb.append((char) cp);
}
bufferedReader.close();
}
}
System.out.println(sb.toString());
in.close();
break;
} catch (Exception e) {
try {
System.out.println("in catch.....");
retry.errorOccured();
} catch (RuntimeException e1) {
throw new RuntimeException("Exception while calling URL:"
+ myURL, e);
} catch (Exception e1) {
throw new RuntimeException(e1);
}
}
}
}
static class CrunchifyRetryOnExceptionStrategy {
public static final int DEFAULT_RETRIES = 3;
public static final long DEFAULT_WAIT_TIME_IN_MILLI = 2000;
private int numberOfRetries;
private int numberOfTriesLeft;
private long timeToWait;
public CrunchifyRetryOnExceptionStrategy() {
this(DEFAULT_RETRIES, DEFAULT_WAIT_TIME_IN_MILLI);
}
public CrunchifyRetryOnExceptionStrategy(int numberOfRetries,
long timeToWait) {
this.numberOfRetries = numberOfRetries;
numberOfTriesLeft = numberOfRetries;
this.timeToWait = timeToWait;
}
/**
* @return true if there are tries left
*/
public boolean shouldRetry() {
return numberOfTriesLeft > 0;
}
public void errorOccured() throws Exception {
if (!shouldRetry()) {
throw new Exception("Retry Failed: Total " + numberOfRetries
+ " attempts made at interval " + getTimeToWait()
+ "ms");
}
numberOfTriesLeft--;
waitUntilNextTry();
}
public long getTimeToWait() {
return timeToWait;
}
private void waitUntilNextTry() {
try {
Thread.sleep(getTimeToWait());
} catch (InterruptedException ignored) {
}
}
}
}
Output1:
With URL: https://crunchify.com/wp-content/uploads/code/json.sample.txt
Requested URL:https://crunchify.com/wp-content/uploads/code/json.sample.txt
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
Output2:
With URL: https://crunchify.com/wp-content/uploads/code/json.sample2.txt
Requested URL:https://crunchify.com/wp-content/uploads/code/json.sample2.txt in catch..... Requested URL:https://crunchify.com/wp-content/uploads/code/json.sample2.txt in catch..... Requested URL:https://crunchify.com/wp-content/uploads/code/json.sample2.txt in catch..... Exception in thread "main" java.lang.RuntimeException: java.lang.Exception: <strong>Retry Failed: Total 3 attempts made at interval 2000ms</strong> at com.crunchify.tutorials.CrunchifyRetryNTimes.main(CrunchifyRetryNTimes.java:58) Caused by: java.lang.Exception: Retry Failed: Total 3 attempts made at interval 2000ms at com.crunchify.tutorials.CrunchifyRetryNTimes$CrunchifyRetryOnExceptionStrategy.errorOccured(CrunchifyRetryNTimes.java:93) at com.crunchify.tutorials.CrunchifyRetryNTimes.main(CrunchifyRetryNTimes.java:53)
Share your thoughts.

