2010-03-17 2 views
12

У меня есть клиент веб-сервиса стиля JAX-WS, который был автоматически сгенерирован с помощью среды IDE NetBeans.Можно ли повторно использовать объекты javax.xml.ws.Service?

Сгенерированная фабрика прокси (расширяет javax.xml.ws.Service) делегирует создание прокси различным методам Service.getPort. Приложение, которое я поддерживаю, создает экземпляр фабрики и получает прокси каждый раз, когда он вызывает целевую услугу.

Было показано, что создание новых экземпляров фабрики proxy было дорогостоящим, учитывая, что документация WSDL, предоставленная фабричному конструктору, URI HTTP, повторно извлекается для каждого экземпляра.

У нас был успех в улучшении производительности путем кэширования WSDL. Но это имеет уродливое обслуживание и последствия для упаковки для нас.

Я хотел бы изучить пригодность кэширования самой фабрики прокси. Безопасно ли, например, два разных клиентских класса, выполняемых на одной JVM и нацеленных на один и тот же веб-сервис, безопасно использовать одну и ту же фабрику для получения отдельных объектов-прокси (или общего, повторного)?

Мне не удалось найти руководство ни по спецификации JAX-WS, ни по документации javax.xml.ws API. Множественность фабрично-доверенных мне неясна. Наличие Service.getPort, а не Service.createPort не внушает доверия.

ответ

2

вы можете 10000 портов в доли секунды, поэтому рекомендуется хранить сервис. Также возможно сохранить локальный wsdl и позже изменить конечную точку.

пример 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); 
    }  
} 
Смежные вопросы