使用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());
}
}