幽兰生空谷
--绝世独自开

关于定时任务中执行http请求CloseableHttpClient 的execute 方法时,Response返回为空的问题

背景:

在定时任务中,使用工具类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);
    }
}
赞(1) 打赏
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《关于定时任务中执行http请求CloseableHttpClient 的execute 方法时,Response返回为空的问题》
文章链接:https://www.itheibai.com/archives/1644
免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途,网站会员捐赠是您喜欢本站而产生的赞助支持行为,仅为维持服务器的开支与维护,全凭自愿无任何强求。

评论 抢沙发

评论前必须登录!

 

养成“打赏”的好习惯,从我做起!

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册