1. 程式人生 > >使用httpclient實現http介面呼叫遇到的坑

使用httpclient實現http介面呼叫遇到的坑

最近做一個使用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());
             
        }
              
    }