2012-10-03 55 views
2

我想知道是否有可能在JAX-WS中禁用套接字連接池?在JAX-WS中禁用SSL套接字連接池?

我打電話給Jetty內部的web服務。 Web服務在任何給定時間都設計爲最多有兩個連接到服務器。其中一個連接是用於對服務器執行pub/sub輪詢的阻塞連接。另一個連接用於製作標準的SOAP請求。連接輪詢後,不能使用其他連接進行輪詢,或者服務器返回錯誤。

爲此,我創建了兩個SOAP端口,其中一個用於輪詢,另一個用於發出請求。這很好,直到輪詢器返回一些數據,並且SOAP請求連接處於空閒狀態。當發生這種情況時,下次我嘗試使用相同的SOAP端口進行輪詢時,它會從連接池中選擇一個連接並重新使用它。如果碰巧得到SOAP請求連接,則服務器返回一個錯誤。從那時起,輪詢者死在了水中,因爲我創建的任何新的SOAP端口都最終重用了這兩個連接中的一個,這兩個連接都被認爲是無效的。

一個可能的解決方案是禁用連接池,這意味着每次創建一個新的SOAP端口時,它都會建立一個新的連接。要麼是這樣,要麼是一種讓我可以強行關閉的插槽本身。

也可能值得一提的是,與服務器的連接是相互認證的SSL連接。

僅供參考,這裏的服務器,我試圖連接到規格:

http://www.trustedcomputinggroup.org/files/resource_files/93C23F2A-1A4B-B294-D0A36CCD8A9E7BD3/TNC_IFMAP_v2_0R0_47.pdf

任何幫助,將不勝感激!謝謝,馬歇爾

回答

0

我嘗試了很多不同的事情後,發現瞭解決我的問題的解決方案。不幸的是,我無法弄清楚如何禁用連接池。如果有人知道如何做到這一點,我想聽聽解決方案。

我結束了創建自己的自定義的SSL套接字工廠充當傳遞到默認的SSL套接字工廠,這是我在HttpsURLConnection的類設置:

SSLContext context = SSLContext.getInstance("TLS"); 
context.init(new KeyManager[] { new ClientKeyManager() }, 
    new TrustManager[] { new ClientTrustManager() }, 
    new SecureRandom()); 
HttpsURLConnection.setDefaultSSLSocketFactory(new ManagedSSLSocketFactory(context.getSocketFactory())); 

注意,我通過在默認來自SSLContext類的套接字工廠。 ManagedSSLSocketFactory的代碼如下所示:

private class ManagedSSLSocketFactory extends SSLSocketFactory 
{ 
    private SSLSocketFactory m_socketFactory; 

    public ManagedSSLSocketFactory(SSLSocketFactory socketFactory) 
    { 
     m_socketFactory = socketFactory; 
    } 

    @Override 
    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException 
    { 
     Socket socket = m_socketFactory.createSocket(s, host, port, autoClose); 

     //Note that m_arcThread, m_arcSocket, etc are defined in the containing class 
     if(Thread.currentThread() == m_arcThread) 
     { 
      if(m_arcSocketInvalid || (socket == m_ssrcSocket)) 
      { 
       closeSocketQuietly(socket); 
       return createSocket(s, host, port, autoClose); 
      } 
      m_arcSocketInvalid = false; 
     } 

     ... omitted some convoluted code that deals with edge cases 

     return socket; 
    } 

    ... rest of implementation 

}