Я использую запросы отправки httpclient для вызова интерфейсов других систем. На самом деле я установил тайм-аут. в тестовой среде. Это нормальная работа. Но в производственной среде не сработало, этот запрос занял 2 минуты. Ниже мой код:
String url = "https://apitest.i.sinotrans.com:8065/idp/v1/restful/IDPAuthenticate?appId=TEST2019QWWE&remoteIp=0:0:0:0:0:0:0:1";
JSONObject result = HttpsUtils.doPost(url.toString(),headers)
И код HttpsUtils:
public class HttpsUtils {
private static PoolingHttpClientConnectionManager connMgr;
private static RequestConfig requestConfig;
private static final int MAX_TIMEOUT = 3000;
private static Logger logger = Logger.getLogger("HttpsUtils.class");
private static Log log= LogFactory.getLog(HttpsUtils.class);
static {
connMgr = new PoolingHttpClientConnectionManager();
connMgr.setMaxTotal(100);
connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());
// Validate connections after 1 sec of inactivity
connMgr.setValidateAfterInactivity(1000);
RequestConfig.Builder configBuilder = RequestConfig.custom();
// set timeout
configBuilder.setConnectTimeout(MAX_TIMEOUT);
configBuilder.setSocketTimeout(MAX_TIMEOUT);
configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);
requestConfig = configBuilder.build();
}
public static JSONObject doPost(String apiUrl,Map<String,String> headers) throws Exception{
return doPost(apiUrl,new HashMap<>(5),headers);
}
/**
* send post
*
* @param apiUrl URL
* @param params params map
* @return
*/
public static JSONObject doPost(String apiUrl, Map<String, Object> params,Map<String,String> headers) throws Exception{
CloseableHttpClient httpClient = null;
if (apiUrl.startsWith("https")) {
httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
} else {
httpClient = HttpClients.createDefault();
}
String httpStr = null;
HttpPost httpPost = new HttpPost(apiUrl);
for(Map.Entry<String, String> entry : headers.entrySet()){
httpPost.addHeader(entry.getKey(),entry.getValue());
}
CloseableHttpResponse response = null;
try {
httpPost.setConfig(requestConfig);
List<NameValuePair> pairList = new ArrayList<NameValuePair>(params.size());
for (Map.Entry<String, Object> entry : params.entrySet()) {
NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue().toString());
pairList.add(pair);
}
httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
log.warn("start time:" + sdf.format(new Date()));
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("123");
httpPost.abort();
}
},5000);
response = httpClient.execute(httpPost);
log.warn("end time :" + sdf.format(new Date()));
HttpEntity entity = response.getEntity();
httpStr = EntityUtils.toString(entity, "UTF-8");
} catch (IOException e) {
logger.log(Level.WARNING," doPost Map error", e);
} finally {
if (response != null) {
try {
EntityUtils.consume(response.getEntity());
} catch (IOException e) {
logger.log(Level.WARNING," doPost Map error", e);
}
}
}
return JSON.parseObject(httpStr);
}
private static SSLConnectionSocketFactory createSSLConnSocketFactory() {
SSLConnectionSocketFactory sslsf = null;
try {
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return true;
}
}).build();
sslsf = new SSLConnectionSocketFactory(sslContext, new HostnameVerifier() {
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
});
} catch (GeneralSecurityException e) {
logger.log(Level.WARNING," createSSLConnSocketFactory error", e);
}
return sslsf;
}
}
Я установил три параметра :
- setConnectTimeout setSocketTimeout setConnectionRequestTimeout
И запустите отдельный таймер, чтобы прервать httpPost . Но в производственной среде это все равно не работает! Я могу убедиться, что код согласован. Вы можете мне помочь?