/** * Copyright (c) Codice Foundation * <p> * This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser * General Public License as published by the Free Software Foundation, either version 3 of the * License, or any later version. * <p> * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. A copy of the GNU Lesser General Public License * is distributed along with this program and can be found at * <http://www.gnu.org/licenses/lgpl.html>. */ package org.codice.solr.factory.impl; import java.io.IOException; import java.io.InterruptedIOException; import java.net.UnknownHostException; import javax.net.ssl.SSLException; import org.apache.commons.lang.time.DurationFormatUtils; import org.apache.http.client.HttpRequestRetryHandler; import org.apache.http.protocol.HttpContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SolrHttpRequestRetryHandler implements HttpRequestRetryHandler { private static final Integer MAX_RETRY_COUNT = 11; private static final Logger LOGGER = LoggerFactory.getLogger(SolrHttpRequestRetryHandler.class); @Override public boolean retryRequest(IOException e, int retryCount, HttpContext httpContext) { if (e instanceof InterruptedIOException) { LOGGER.debug("Connection timeout."); } if (e instanceof UnknownHostException) { LOGGER.warn("Solr Client: Unknown host."); } if (e instanceof SSLException) { LOGGER.warn("Solr Client: SSL handshake exception."); } LOGGER.debug("Connection failed", e); try { long waitTime = (long) Math.pow(2, Math.min(retryCount, MAX_RETRY_COUNT)) * 50; LOGGER.debug("Solr Client: Connection failed, waiting {} before retrying.", DurationFormatUtils.formatDurationWords(waitTime, true, true)); synchronized (this) { wait(waitTime); } } catch (InterruptedException ie) { LOGGER.debug("Exception while waiting.", ie); } return true; } }