1 /*
2 * ====================================================================
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 * ====================================================================
20 *
21 * This software consists of voluntary contributions made by many
22 * individuals on behalf of the Apache Software Foundation. For more
23 * information on the Apache Software Foundation, please see
24 * <http://www.apache.org/>.
25 *
26 */
27
28 package org.apache.http.impl.client;
29
30 import org.apache.http.HttpResponse;
31 import org.apache.http.HttpStatus;
32 import org.apache.http.annotation.Immutable;
33 import org.apache.http.client.ServiceUnavailableRetryStrategy;
34 import org.apache.http.protocol.HttpContext;
35
36 /**
37 * Default implementation of the {@link ServiceUnavailableRetryStrategy} interface.
38 * that retries <code>503</code> (Service Unavailable) responses for a fixed number of times
39 * at a fixed interval.
40 *
41 * @since 4.2
42 */
43 @Immutable
44 public class DefaultServiceUnavailableRetryStrategy implements ServiceUnavailableRetryStrategy {
45
46 /**
47 * Maximum number of allowed retries if the server responds with a HTTP code
48 * in our retry code list. Default value is 1.
49 */
50 private final int maxRetries;
51
52 /**
53 * Retry interval between subsequent requests, in milliseconds. Default
54 * value is 1 second.
55 */
56 private final long retryInterval;
57
58 public DefaultServiceUnavailableRetryStrategy(int maxRetries, int retryInterval) {
59 super();
60 if (maxRetries < 1) {
61 throw new IllegalArgumentException("MaxRetries must be greater than 1");
62 }
63 if (retryInterval < 1) {
64 throw new IllegalArgumentException("Retry interval must be greater than 1");
65 }
66 this.maxRetries = maxRetries;
67 this.retryInterval = retryInterval;
68 }
69
70 public DefaultServiceUnavailableRetryStrategy() {
71 this(1, 1000);
72 }
73
74 public boolean retryRequest(final HttpResponse response, int executionCount, final HttpContext context) {
75 return executionCount <= maxRetries &&
76 response.getStatusLine().getStatusCode() == HttpStatus.SC_SERVICE_UNAVAILABLE;
77 }
78
79 public long getRetryInterval() {
80 return retryInterval;
81 }
82
83 }