2012-06-28 43 views
0

我正在使用wsdl2java生成的Axis 2(1.6.1)java客戶端。無法發送ViaPost - 在Axis2客戶端存根上

這似乎是工作正常,但不時我得到以下錯誤:

14:38:04855 INFO [HTTPSender]無法sendViaPost到網址[...]

java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(SocketInputStream.java:168) 
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293) 
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331) 
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:798) 
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:755) 
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75) 
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 
at java.io.BufferedInputStream.read(BufferedInputStream.java:237) 
at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78) 
at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106) 

我想知道這是否可能是一個多線程問題,並想就此問題獲得一些答案。 我使用緩存HttpClient的存根。 HttpClient使用MultiThreadedHttpConnectionManager,我將setDefaultMaxConnectionsPerHost設置爲20.

我知道HttpClient憑藉關聯的MultiThreadedHttpConnectionManager將是線程安全的。 問題是Axis2存根會發生什麼?存根是否也是線程安全的?

我看過一些帖子,說明Axis存根並非線程安全設計。 如果是這樣的話,使用多線程HttpClient有什麼好處? 如何確保Axis客戶端存根在多線程環境中可用?

謝謝

回答

0

「連接復位」的錯誤意味着服務器意外關閉了連接。當你得到這個錯誤時,問題在於遠程服務器,而不是你的客戶端。

MultiThreadedHttpConnectionManager是一個HTTP連接的多線程安全緩存。多個線程可以從緩存中獲取連接,或者將緩存返回到緩存而不會導致緩存成爲瓶頸。單個HttpClient或擁有HttpClient的存根應該只能由一個線程一次使用。 HttpClient擁有到遠程服務器的實際TCP連接,並且該連接一次只支持一個正在進行的請求。

+0

謝謝你的回覆。如果這對客戶不是一個問題,我想這會讓我有些放心。 –

+0

假設存根不是線程安全的,我真的有三個選擇:1.每次發出請求時創建/銷燬存根2.使用ThreadLocal存根或3.同步對共享實例(或實例池)的訪問的存根。 ThreadLocal選項對CPU的影響最小,但可能會在具有大型線程池的服務器上顯着增加內存佔用量。另外兩個可以將內存佔用降到最低,但是會需要更多(?)更多的CPU。根據你的經驗,你會推薦一種方法嗎?謝謝 –

相關問題