背景:
在定时任务中,使用工具类HttpEngineUtil 进行htttp请求时,在执行一段时间后,总是报错,原因是任务执行时reponse返回为空,但再用ApiFox或postman去请求时,又会请求成功。
原工具类如下:
package com.hdyy.timetask.manbing_p_bmsxywebdb_chushihuakucun_zbjkpthttp.utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;
import javax.net.ssl.SSLContext;
public class HttpEngineUtil {
private static Logger logger = Logger.getLogger(HttpEngineUtil.class);
/**
* 执行Post请求
*
* @param url
* @param paramMap 参数
* @return
*/
public static String doPost(String url, Map<String, String> paramMap, int timeOutSeconds) {
//创建HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
String resultString = "";
try {
//创建HttpPost请求
HttpPost httpPost = new HttpPost(url);
//设置超时时间
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(timeOutSeconds * 1000).setConnectionRequestTimeout(timeOutSeconds * 1000)
.setSocketTimeout(timeOutSeconds * 1000).build();
httpPost.setConfig(requestConfig);
//创建参数列表
if (paramMap != null && paramMap.size() > 0) {
List<NameValuePair> paramList = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> paramEntry : paramMap.entrySet()) {
paramList.add(new BasicNameValuePair(paramEntry.getKey(), paramEntry.getValue()));
}
//模拟表单
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "UTF-8");
httpPost.setEntity(entity);
}
//执行Post请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
} catch (Exception e) {
logger.warn("发送post请求失败: url=" + url);
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
}
定时任务如下:

三个接口请求任务,只有一个执行一段时间后,会返回为空。
经过查阅资料后,大概定位为SSL证书的问题。
解决方案:
1、可以在服务器上部署SSL证书
2、可以通过代码设置忽略SSL证书
下面介绍第二种方式:
修改后的工具类:
package com.hdyy.timetask.manbing_p_bmsxywebdb_chushihuakucun_zbjkpthttp.utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;
import javax.net.ssl.SSLContext;
public class HttpEngineUtil {
private static Logger logger = Logger.getLogger(HttpEngineUtil.class);
private static CloseableHttpClient httpClient;
/**
* 执行Post请求
*
* @param url
* @param paramMap 参数
* @return
*/
public static String doPost(String url, Map<String, String> paramMap, int timeOutSeconds) {
//创建HttpClient对象
// CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
//创建HttpPost请求
HttpPost httpPost = new HttpPost(url);
//设置超时时间
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(timeOutSeconds * 1000).setConnectionRequestTimeout(timeOutSeconds * 1000)
.setSocketTimeout(timeOutSeconds * 1000).build();
httpPost.setConfig(requestConfig);
//创建参数列表
if (paramMap != null && paramMap.size() > 0) {
List<NameValuePair> paramList = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> paramEntry : paramMap.entrySet()) {
paramList.add(new BasicNameValuePair(paramEntry.getKey(), paramEntry.getValue()));
}
//模拟表单
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "UTF-8");
httpPost.setEntity(entity);
}
//执行Post请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
} catch (Exception e) {
logger.warn("发送post请求失败: url=" + url);
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
//请求忽略SSL证书
static {
try {
SSLContext sslContext = SSLContextBuilder.create().useProtocol(SSLConnectionSocketFactory.SSL).loadTrustMaterial((x, y) -> true).build();
RequestConfig config = RequestConfig.custom().setConnectTimeout(5000).setSocketTimeout(5000).build();
httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).setSSLContext(sslContext).setSSLHostnameVerifier((x, y) -> true).build();
} catch (Exception e) {
e.printStackTrace();
}
}
}
AI调优后的代码
package com.hdyy.timetask.manbing_p_bmsxywebdb_chushihuakucun_zbjkpthttp.utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.xxl.job.core.log.XxlJobLogger;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;
import javax.net.ssl.SSLContext;
public class HttpEngineUtil {
private static final Logger logger = Logger.getLogger(HttpEngineUtil.class);
private static final CloseableHttpClient httpClient;
static {
try {
// 忽略 SSL 证书验证(需谨慎使用)
SSLContext sslContext = SSLContextBuilder.create()
.loadTrustMaterial((chain, authType) -> true) // 忽略证书验证
.build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,
(hostname, session) -> true); // 忽略主机名验证
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(5000)
.setSocketTimeout(5000)
.build();
httpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(config)
.setSSLSocketFactory(sslsf)
.build();
} catch (Exception e) {
// 捕获异常并记录详细日志
logger.error("初始化 HttpClient 失败", e);
throw new RuntimeException("初始化 HttpClient 失败", e);
}
}
/**
* 执行 Post 请求
*
* @param url 请求地址
* @param paramMap 请求参数
* @param timeOutSeconds 超时时间(秒)
* @return 响应结果
*/
public static String doPost(String url, Map<String, String> paramMap, int timeOutSeconds) {
if (url == null || url.isEmpty()) {
logger.error("请求 URL 不能为空");
return "";
}
String resultString = "";
try (CloseableHttpResponse response = executeHttpPost(url, paramMap, timeOutSeconds)) {
if (response != null && response.getStatusLine() != null) {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode >= 200 && statusCode < 300) {
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
} else {
logger.warn("请求失败,状态码: " + statusCode + ", URL: " + url);
}
}
} catch (Exception e) {
logger.error("发送 POST 请求失败: URL=" + url, e);
XxlJobLogger.log("发送 POST 请求失败: URL=" + url, e);
}
return resultString;
}
private static CloseableHttpResponse executeHttpPost(String url, Map<String, String> paramMap, int timeOutSeconds) throws IOException {
HttpPost httpPost = new HttpPost(url);
// 设置超时时间
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(timeOutSeconds * 1000)
.setConnectionRequestTimeout(timeOutSeconds * 1000)
.setSocketTimeout(timeOutSeconds * 1000)
.build();
httpPost.setConfig(requestConfig);
// 设置请求参数
if (paramMap != null && !paramMap.isEmpty()) {
List<NameValuePair> paramList = new ArrayList<>();
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
paramList.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "UTF-8");
httpPost.setEntity(entity);
}
// 执行请求
return httpClient.execute(httpPost);
}
}
评论前必须登录!
注册