2010-03-17 4 views
12

NetBeans IDE에서 자동 생성 된 JAX-WS 스타일 웹 서비스 클라이언트가 있습니다.javax.xml.ws.Service 객체를 다시 사용하는 것이 안전합니까?

생성 된 프록시 팩토리 (javax.xml.ws.Service 확장)는 프록시 생성을 다양한 Service.getPort 메소드에 위임합니다. 유지 관리하는 응용 프로그램은 공장을 인스턴스화하고 대상 서비스를 호출 할 때마다 프록시를 얻습니다.

팩토리 생성자에 제공된 WSDL 문서 인 HTTP URI가 각 인스턴스화마다 다시 검색되면 새 프록시 팩토리 인스턴스를 반복적으로 만드는 것이 비용이 많이 드는 것으로 나타났습니다.

우리는 WSDL을 캐싱하여 성능을 향상시키는 데 성공했습니다. 그러나 이것은 우리에게 추악한 유지 보수 및 패키징 관련 사항을 가지고 있습니다.

프록시 팩토리 캐싱의 적합성을 탐구하고 싶습니다. 예를 들어 동일한 JVM에서 실행되고 동일한 웹 서비스를 대상으로하는 두 개의 다른 클라이언트 클래스가 안전하게 동일한 팩토리를 사용하여 고유 한 프록시 객체 (또는 공유 된 재진입 성 객체)를 얻을 수 있습니까?

JAX-WS 스펙이나 javax.xml.ws API 문서에서 지침을 찾을 수 없습니다. 팩토리 - 프록시 다중성은 나에게 불분명하다. Service.createPort 대신 Service.getPort를 사용한다고해서 확신이 들지 않습니다.

답변

2

10000 포트를 초 단위로 사용할 수 있으므로 서비스를 저장하는 것이 좋습니다. wsdl local을 저장하고 나중에 엔드 포인트를 변경할 수도 있습니다.

& 예 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); 
    }  
} 
관련 문제