Implement
an utility class such that, it takes a code snippet and executes with the
configured number of retries until it is successful.
Find the below working application.
RetryableTask.java
package com.sample.app.interfaces;
public interface RetryableTask {
/**
* Block of code to retry
*/
void execute();
}
RetryHandler.java
package com.sample.app.handler;
import com.sample.app.interfaces.RetryableTask;
public class RetryHandler {
private int noOfRetries = 0;
public RetryHandler(int noOfRetries) {
if (noOfRetries <= 0) {
throw new IllegalArgumentException("Number of retries is <= 0");
}
this.noOfRetries = noOfRetries;
}
public void execute(RetryableTask retryableTask) {
int retries = 0;
while (true) {
try {
retryableTask.execute();
break;
} catch (Throwable t) {
retries++;
if (retries > this.noOfRetries) {
System.err.println("Maximum retries finished......");
throw t;
}
System.err.println("Error occurred, retrying another time");
}
}
}
}
RetryTaskDemo.java
package com.sample.app;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import com.sample.app.handler.RetryHandler;
import com.sample.app.interfaces.RetryableTask;
public class RetryTaskDemo {
public static void main(String[] args) {
RetryableTask task = new RetryableTask() {
@Override
public void execute() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
System.out.println("Enter 'p' to exit successfully, non 'p' to throw an exception");
try {
input = br.readLine();
if ("p".equals(input)) {
System.out.println("Task executed successfully");
} else {
throw new RuntimeException("Task failed");
}
} catch (IOException e) {
e.printStackTrace(System.err);
}
}
};
RetryHandler retryHandler = new RetryHandler(2);
retryHandler.execute(task);
}
}
Sample run 1 : Successful scenario
Enter 'p' to exit successfully, non 'p' to throw an exception p Task executed successfully
Sample run 2 : Failed scenario
Enter 'p' to exit successfully, non 'p' to throw an exception
p
Task executed successfully
Sample run 2 : Failed scenario
Enter 'p' to exit successfully, non 'p' to throw an exception
f
Error occurred, retrying another time
Enter 'p' to exit successfully, non 'p' to throw an exception
f
Error occurred, retrying another time
Enter 'p' to exit successfully, non 'p' to throw an exception
f
Maximum retries finished......
Exception in thread "main" java.lang.RuntimeException: Task failed
at com.sample.app.RetryTaskDemo$1.execute(RetryTaskDemo.java:25)
at com.sample.app.handler.RetryHandler.execute(RetryHandler.java:20)
at com.sample.app.RetryTaskDemo.main(RetryTaskDemo.java:35)
Sample run 3 : Task successful in given number of retries
Enter 'p' to exit successfully, non 'p' to throw an exception f Error occurred, retrying another time Enter 'p' to exit successfully, non 'p' to throw an exception f Error occurred, retrying another time Enter 'p' to exit successfully, non 'p' to throw an exception p Task executed successfully
You may like
java.util.Date vs java.sql.Date
How to break out of nested loops in Java?
Implementation of Bag data structure in Java
Scanner throws java.util.NoSuchElementException while reading the input
No comments:
Post a Comment