2010-03-17 8 views
12

Ich habe JAX-WS Stil Web-Service-Client, der mit der NetBeans IDE automatisch generiert wurde.Ist es sicher, javax.xml.ws.Service-Objekte wiederzuverwenden?

Die generierte Proxy-Factory (erweitert javax.xml.ws.Service) delegiert die Proxy-Erstellung an die verschiedenen Service.getPort-Methoden. Die Anwendung, die ich betreue, instanziiert die Factory und erhält bei jedem Aufruf des Zieldienstes einen Proxy.

Das wiederholte Erstellen der Proxy-Factory-Instanzen hat sich als kostspielig erwiesen, da die dem Factory-Konstruktor übergebene WSDL-Dokumentation, ein HTTP-URI, für jede Instanziierung erneut abgerufen wird.

Wir hatten Erfolg beim Verbessern der Leistung durch Zwischenspeichern der WSDL. Aber das hat hässliche Wartungs- und Verpackungsimplikationen für uns.

Ich würde gerne die Eignung der Zwischenspeicherung der Proxy-Fabrik selbst erkunden. Ist es sicher, z. B. können zwei verschiedene Client-Klassen, die auf derselben JVM ausgeführt werden und denselben Web-Service als Ziel haben, die gleiche Factory sicher verwenden, um unterschiedliche Proxy-Objekte zu erhalten (oder eine geteilte, wiedereintretende)?

Ich konnte keine Anleitung aus der JAX-WS-Spezifikation oder der javax.xml.ws-API-Dokumentation finden. Die Fabrik-Proxy-Vielfalt ist mir unklar. Wenn Service.getPort statt Service.createPort verwendet wird, ist das nicht vertrauenswürdig.

Antwort

2

können Sie 10000 Ports in Sekundenbruchteilen, so ist es eine gute Idee, Service zu speichern. Es ist auch möglich, das lokale wsdl zu speichern und das endpoint später zu ändern.

Beispiel peopleWsdl & peopleEndpoint:
file:/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); 
    }  
} 
Verwandte Themen