2010-03-17 79 views
12

我有使用NetBeans IDE自動生成的JAX-WS樣式的Web服務客戶端。重用javax.xml.ws.Service對象是否安全?

生成的代理工廠(擴展javax.xml.ws.Service)將代理創建委託給各種Service.getPort方法。我維護的應用程序實例化工廠,並在每次調用目標服務時獲取代理。

由於爲每個實例化重新檢索了提供給工廠構造函數的WSDL文檔(一個HTTP URI),因此重複創建新的代理工廠實例顯示出代價很高。

我們成功地通過緩存WSDL來提高性能。但是這對我們來說具有難以維護和包裝的影響。

我想探索緩存代理工廠本身的適用性。它是否安全?例如,可以在同一個JVM上執行並針對同一個Web服務的兩個不同的客戶端類安全地使用相同的工廠來獲得不同的代理對象(或共享的,可重入的對象)?

我一直無法從JAX-WS規範或javax.xml.ws API文檔中找到指導。工廠代理的多樣性對我來說還不清楚。擁有Service.getPort而不是Service.createPort不會激發信心。

回答

2

您可以以秒爲單位的10000個端口,因此存儲服務是一個不錯的主意。 也可以存儲wsdl local並稍後更改endppoint。

例如peopleWsdl & peopleEndpoint:
文件:/ C:/Users/richard/Workspaces/OSB/SyllabusMailing/war/WEB-INF/wsdl/people/People_2_0.wsdl http://myserver:8011/domain/sem/People_2_0?wsdl

private static DSSeMPeople service = null; 
private DsSemPeoplePort getPort() throws Exception 
{ 
    String wsdl = AppUtil.getWebXmlParameter("peopleWsdl"); 
    String endpoint = AppUtil.getWebXmlParameter("peopleEndpoint"); 
    if(wsdl==null || "".equals(wsdl)) { 
     wsdl = endpoint; 
    } 

    try { 
     if(service==null) { 

      log.info("create peopleService from wsdl: " + wsdl);    
      log.info("use peopleService endpoint: " + (endpoint==null?"(from wsdl)":endpoint)); 

      URL url = new URL(wsdl);    
      service = new DSSeMPeople(url, new QName("http://www.tudelft.nl/domain/sem/people_2_0/", "DS_SeM_People")); 
     } 

     DsSemPeoplePort port = service.getDsSemPeoplePort(); 

     // set endpoint 
     if(endpoint!=null && !"".equals(endpoint) && !endpoint.equals(wsdl)) { 

      BindingProvider provider = (BindingProvider) port; 
      provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint); 
     } 

     return port; 

    } catch (Exception e) { 

     String msg = "Failed to connect to people webservice. "; 
     log.error(msg); 
     throw new Exception(msg, e); 
    }  
} 
相關問題