RetryTools.java

package eu.javaexperience.retry;

import eu.javaexperience.interfaces.simple.SimpleGet;
import eu.javaexperience.log.JavaExperienceLoggingFacility;
import eu.javaexperience.log.LogLevel;
import eu.javaexperience.log.Loggable;
import eu.javaexperience.log.Logger;
import eu.javaexperience.log.LoggingTools;

public class RetryTools
{
	protected static final Logger LOG = JavaExperienceLoggingFacility.getLogger(new Loggable("RetryTools"));
	
	protected static final int[] RECONNECT_TIMES = {100, 200, 500, 1_000, 2_000, 5_000, 10_000};
	
	public static int[] getDefaultReconnectTimeMillisecs()
	{
		return RECONNECT_TIMES;
	}
	
	public static <T> SimpleGet<T> waitReconnect
	(
		SimpleGet<T> connect,
		String entity,
		Logger log,
		LogLevel lvl,
		int... reconnectWaitTimes)
	{
		return ()->
		{
			for(int i=0;i<reconnectWaitTimes.length;++i)
			{
				try
				{
					return connect.get();
				}
				catch(Exception e)
				{
					if(reconnectWaitTimes[i] < 0)
					{
						throw e;
					}
					
					LoggingTools.tryLogFormatException(log, lvl, e, "Can't open `%s`, waiting `%s` millisec before trying reconnect again. ", entity, reconnectWaitTimes[i]);
					try
					{
						Thread.sleep(reconnectWaitTimes[i]);
					}
					catch (InterruptedException e1)
					{
						return null;
					}
					
					if(i >= reconnectWaitTimes.length-1)
					{
						i = reconnectWaitTimes.length-2;
					}
				}
			}
			return null;
		};
	}
	
	public static <T> SimpleGet<T> waitReconnect(SimpleGet<T> connect, String entity, int... reconnectWaitTimes)
	{
		return waitReconnect(connect, entity, LOG, LogLevel.WARNING, reconnectWaitTimes);
	}
	
	public static <T> SimpleGet<T> waitReconnect(SimpleGet<T> connect, String entity)
	{
		return waitReconnect(connect, entity, LOG, LogLevel.WARNING, RECONNECT_TIMES);
	}
}