我知道有其他地方的相關問題,但我的是不同的:)basichttpclient執行拋出「SingleClientConnManager:連接仍然分配」爲什麼?
我使用BasicHttpClient和HttpPoster發送東西到第三方服務。我在使用這種情況下,我有JMS監聽器使用單個bean發佈的東西。我不認爲這是一個問題,因爲BasicHttpclient使用SingleClientConnectionManager和javadoc中說
This connection manager maintains only one active connection at a time. Even though this class is thread-safe it ought to be used by one execution thread only.
(線程安全在這裏是關鍵),但是,當我有兩個同時請求我得到的經典
java.lang.IllegalStateException: Invalid use of SingleClientConnManager: connection still allocated.
爲什麼我得到那個?我不清理任何東西,因爲basicclient根據文檔做了這些事情。
我的豆構造:
HttpParams params = new BasicHttpParams();
params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, SMS_SOCKET_TIMEOUT);
params.setParameter(CoreConnectionPNames.SO_TIMEOUT, SMS_SOCKET_TIMEOUT);
params.setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET,
encoding);
params.setParameter(CoreProtocolPNames.HTTP_ELEMENT_CHARSET,
encoding);
httpclient = new DefaultHttpClient(params);
poster = new HttpPost(mtUrl);
poster.setHeader("Content-type", contentType);
responseHandler = new BasicResponseHandler();
我的代碼運行後的呼叫:
public String[] sendMessage(MtMessage mess) throws MtSendException, MtHandlingException {
StringEntity input;
try {
String postBody = assembleMessagePostBody(mess);
input = new StringEntity(postBody);
poster.setEntity(input);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String response = httpclient.execute(poster, responseHandler);
return new String[]{extractResponseMessageId(response)};
} catch(HttpResponseException ee){
throw new MtSendException(ee.getStatusCode(), ee.getMessage(), false);
} catch (IOException e) {
throw new MtSendException(0, e.getMessage(), false);
} finally{
}
}
我認爲,雖然「的sendMessage」可以從多個JMS偵聽器線程在被調用一次,它將是線程安全的,因爲connectionhandler是線程安全的。我想我可以讓sendMessage()方法同步。
如果有人有任何意見,我會非常感謝。
沒錯。通過同步,我希望線程#2等待線程#1的鎖定,而不是API拋出異常,即線程1完成後線程2可以執行它的http請求。感謝您澄清,猜猜我會看到有哪些聯網遊戲。 – Mathias 2012-03-16 12:46:42