2010-03-17 16 views
12

Ho un client di servizio Web in stile JAX-WS che è stato generato automaticamente con l'IDE NetBeans.È sicuro riutilizzare oggetti javax.xml.ws.Service?

Il factory proxy generato (estende javax.xml.ws.Service) delega la creazione del proxy ai vari metodi di Service.getPort. L'applicazione che sto mantenendo istanzia la fabbrica e ottiene un proxy ogni volta che chiama il servizio mirato.

Creare ripetutamente le nuove istanze del proxy factory è risultato costoso, dato che la documentazione WSDL fornita al costruttore factory, un URI HTTP, viene recuperata per ogni istanza.

Abbiamo avuto successo nel migliorare le prestazioni memorizzando nella cache il WSDL. Ma questo ha delle brutte implicazioni sulla manutenzione e l'imballaggio per noi.

Vorrei esplorare l'idoneità della memorizzazione nella cache della stessa fabbrica proxy. È sicuro, ad es., Che due diverse classi client, eseguite sulla stessa JVM e rivolte allo stesso servizio web, utilizzino in sicurezza lo stesso factory per ottenere oggetti proxy distinti (o uno condiviso, rientrante)?

Non sono riuscito a trovare indicazioni né sulla specifica JAX-WS né sulla documentazione dell'API javax.xml.ws. La molteplicità del proxy di fabbrica non mi è chiara. Avere Service.getPort piuttosto che Service.createPort non ispira fiducia.

risposta

2

è possibile 10000 porte in frazione di secondo, quindi è consigliabile archiviare il servizio. È anche possibile memorizzare wsdl local e modificare l'endpoint in un secondo momento.

esempio 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); 
    }  
}