2012-03-12 60 views
0

我知道有其他地方的相關問題,但我的是不同的:)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()方法同步。

如果有人有任何意見,我會非常感謝。

回答

1

SingleClientConnectionManager是完全線程安全的,因爲當多個執行線程使用它的內部狀態時,它的內部狀態是同步的並始終保持一致。這並不改變它只能分配單一連接的事實。因此,如果兩個線程嘗試租用一個連接,只有一個可以成功,而另一個可能會得到'java.lang.IllegalStateException:SingleClientConnManager的無效使用'

如果您的應用程序應該使用池連接管理器需要同時執行請求。

+0

沒錯。通過同步,我希望線程#2等待線程#1的鎖定,而不是API拋出異常,即線程1完成後線程2可以執行它的http請求。感謝您澄清,猜猜我會看到有哪些聯網遊戲。 – Mathias 2012-03-16 12:46:42

相關問題