使用httpclient实现http接口调用遇到的坑

时间:2024-03-05 15:57:26

最近做一个使用httpclient传输json格式参数的接口,使用spring定时器定时触发调用。本来感觉一个简单的小程序,但是上线之后遇到了很奇葩的问题,运行一段时间后spring定时器莫名的死掉了,然后重启服务,几天之后又死掉了。当时第一感觉是不是数据库连接没关闭,导致程序死掉,检查代码连接都正常关闭了。重新启动项目,一天之后定时器又死掉了,又去检查spring定时器,配置都没啥问题。一直把怀疑的方向放在了spring定时器方面,没想到问题其实出在httpclient调用上。去百度httpclient的用法,用法和我写的没有什么太大区别。偶然间看到一篇文章(https://blog.csdn.net/u011191463/article/details/78664896)是说httpclient超时设置的,看后茅塞顿开。因为没有给httpclient调用设置超时时间,导致程序调用超时之后无法响应而死掉。

附上代码,以作警戒!

import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import net.sf.json.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

 public void SendHttp(String wlanTrouble,String telTrouble,String itvTrouble,String diagnosisDate){  
         HttpClient httpclient = new DefaultHttpClient();               
         httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,60000);//连接时间
         httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,60000);//数据传输时间   
         final String CONTENT_TYPE_TEXT_JSON = "text/json";          
        String HttpUrl="http://192.168.202.223:7807/openit/class_7?ServiceName=DiagnosisCountUpload&ServiceVer=1.0&Consumer=112IVR";  
        HttpPost httppost = new HttpPost(HttpUrl);     
        try {
                String req = "{\"diagnosis\": {\"wlanTrouble\": \""+wlanTrouble+"\",\"telTrouble\": \""+telTrouble+"\",\"itvTrouble\": \""+itvTrouble+"\"},\"diagnosisDate\":\""+diagnosisDate+"\"}";          
                httppost.setHeader("Content-Type", "application/json;charset=UTF-8"); 
                StringEntity se = new StringEntity(req);
                se.setContentType(CONTENT_TYPE_TEXT_JSON);
                httppost.setEntity(se);                   
                HttpResponse response = httpclient.execute(httppost);  
                if (response.getStatusLine().getStatusCode() == 200) {  
                    /*读返回数据*/  
                    String conResult = EntityUtils.toString(response.getEntity());
                    JSONObject sobj = new JSONObject();  
                    sobj = sobj.fromObject(conResult); 
                    String  code= sobj.getString("resultCode");  
                    String result = sobj.getString("resultMsg");                    
                    logger.info("正常返回的code:"+code +"正常返回的info:"+result);
                   
                } else {  
                    String err = response.getStatusLine().getStatusCode()+"";  
                    /*异常返回数据读取*/  
                    String conResult = EntityUtils.toString(response.getEntity());
                    logger.info("异常返回值是:"+conResult);
                    JSONObject sobj = new JSONObject();  
                    sobj = sobj.fromObject(conResult);  
                    logger.info("异常返回转换成json后的值是:"+conResult);
                    String  err_code= sobj.getString("errCode");  
                    String err_desc = sobj.getString("errMessage");                                                               
                }  
        } catch (Exception e) {  
            e.printStackTrace();  
            logger.info("请求异常,异常信息是:"+e.getMessage());
             
        }
              
    }