2010-03-17 22 views
12

Tengo un cliente de servicio web de estilo JAX-WS que se generó automáticamente con NetBeans IDE.¿Es seguro reutilizar objetos javax.xml.ws.Service?

La fábrica de proxy generada (amplía javax.xml.ws.Service) delega la creación de proxy a los diversos métodos Service.getPort. La aplicación que estoy manteniendo ejemplifica la fábrica y obtiene un proxy cada vez que llama al servicio objetivo.

Se ha demostrado que la creación repetida de instancias de fábrica de proxy es costosa, dado que la documentación WSDL suministrada al constructor de fábrica, un URI HTTP, se recupera para cada instanciación.

Tuvimos éxito en mejorar el rendimiento al almacenar en caché el WSDL. Pero esto tiene graves implicaciones de mantenimiento y embalaje para nosotros.

Me gustaría explorar la idoneidad de almacenar en caché la propia fábrica proxy. ¿Es seguro, por ejemplo, pueden dos clases de clientes diferentes, ejecutando en la misma JVM y dirigiéndose al mismo servicio web, usar de forma segura la misma fábrica para obtener distintos objetos proxy (o uno compartido, reentrante)?

No he podido encontrar instrucciones de la especificación JAX-WS ni de la documentación de la API javax.xml.ws. La multiplicidad de proxy de fábrica no está clara para mí. Tener Service.getPort en lugar de Service.createPort no inspira confianza.

Respuesta

2

puede 10000 puertos en fracción de segundo, por lo que es una buena idea almacenar el servicio. También es posible almacenar el wsdl local y cambiar el endppoint más tarde.

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