java http超时重连_httpclient 重连机制
我們?cè)谶M(jìn)行http請(qǐng)求時(shí),難免會(huì)遇到請(qǐng)求失敗的情況,失敗后需要重新請(qǐng)求,嘗試再次獲取數(shù)據(jù)。
Apache的HttpClient提供了異常重試機(jī)制,在該機(jī)制中,我們可以很靈活的定義在哪些異常情況下進(jìn)行重試。
今天有個(gè)小伙伴,遇到了這樣的問題,后來是通過此方法去解決的,
一個(gè)爬蟲,他請(qǐng)求超過了多少次,自動(dòng)就超時(shí)了,目前還沒有找得到具體原因,不過用這個(gè)重連機(jī)制是完美解決了問題的。好了,代碼如下:
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.ConnectException;
import java.net.UnknownHostException;
import javax.net.ssl.SSLException;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Consts;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
public class HttpPostUtils {
public String retryPostJson(String uri, String json, int retryCount, int connectTimeout,
int connectionRequestTimeout, int socketTimeout) throws IOException, ParseException {
if (StringUtils.isAnyBlank(uri, json)) {
return null;
}
HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
if (executionCount > retryCount) {
// Do not retry if over max retry count
return false;
}
if (exception instanceof InterruptedIOException) {
// An input or output transfer has been terminated
return false;
}
if (exception instanceof UnknownHostException) {
// Unknown host 修改代碼讓不識(shí)別主機(jī)時(shí)重試,實(shí)際業(yè)務(wù)當(dāng)不識(shí)別的時(shí)候不應(yīng)該重試,再次為了演示重試過程,執(zhí)行會(huì)顯示retryCount次下面的輸出
System.out.println("不識(shí)別主機(jī)重試"); return true;
}
if (exception instanceof ConnectException) {
System.out.println("連接超時(shí),正在重新請(qǐng)求ing...."); return true;
}
if (exception instanceof SSLException) {
// SSL handshake exception
return false;
}
HttpClientContext clientContext = HttpClientContext.adapt(context);
HttpRequest request = clientContext.getRequest();
boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
if (idempotent) {
// Retry if the request is considered idempotent
return true;
}
return false;
}
};
CloseableHttpClient client = HttpClients.custom().setRetryHandler(httpRequestRetryHandler).build();
HttpPost post = new HttpPost(uri);
// Create request data
StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
// Set request body
post.setEntity(entity);
RequestConfig config = RequestConfig.custom().setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout).setSocketTimeout(socketTimeout).build();
post.setConfig(config);
// Response content
String responseContent = null;
CloseableHttpResponse response = null;
try {
response = client.execute(post, HttpClientContext.create());
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
responseContent = EntityUtils.toString(response.getEntity(), Consts.UTF_8.name());
}
} finally {
if (ObjectUtils.anyNotNull(response)) {
response.close();
}
if (ObjectUtils.anyNotNull(client)) {
client.close();
}
}
return responseContent;
}
總結(jié)
以上是生活随笔為你收集整理的java http超时重连_httpclient 重连机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成语json_人工智能测试爬百度成语测成
- 下一篇: 华为鸿蒙显示安卓,被谷歌除名,华为6月2