package com.xenoage.zong.webserver.actions; import static com.xenoage.utils.jse.thread.ThreadUtils.sleepS; import java.io.IOException; import java.sql.SQLException; import javax.servlet.http.HttpServletResponse; import com.xenoage.zong.webserver.Webserver; import com.xenoage.zong.webserver.model.requests.Request; import com.xenoage.zong.webserver.util.Response; /** * Abstract {@link Action} that is repeated several times, if * its {@link #performTry(Request, Webserver, HttpServletResponse)} method fails. * It throws an {@link IOException} timout exception if all attempts fail. * * @author Andreas Wenger */ public abstract class RetryAction extends Action { private static final int waitTimes[] = { 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5 }; @Override public void perform(Request request, Webserver server, HttpServletResponse response) { try { boolean success = false; for (int retryCount = 0; !success && retryCount <= waitTimes.length; retryCount++) { if (retryCount > 0) sleepS(waitTimes[retryCount - 1]); success = performTry(request, server, response); } if (!success) throw new IOException("timeout"); } catch (Exception ex) { Response.writeError(response, ex.getMessage()); } } /** * Performs this action for the given request. If it returns false, * it was not successfull and requests to be called again. * If it returns true, the action is finished. */ public abstract boolean performTry(Request request, Webserver server, HttpServletResponse response) throws SQLException, IOException; }