2010-03-17 27 views
12

NetBeans IDE ile otomatik olarak oluşturulan JAX-WS stili web hizmeti istemcim var.javax.xml.ws.Service nesnelerini yeniden kullanmak güvenli midir?

Oluşturulan proxy fabrika (javax.xml.ws.Service öğesini genişletir) proxy oluşturulmasını çeşitli Service.getPort yöntemlerine atar. Benim sürdürdüğüm uygulama, fabrikayı başlatır ve hedeflenen hizmeti her aradığında bir proxy alır. Fabrika temsilcisine sağlanan bir HTTP URI'sine verilen WSDL belgelerinin her bir örnekleme için yeniden elde edildiğinden, yeni proxy fabrika örneklerinin tekrar tekrar oluşturulmasının pahalı olduğu görülmüştür.

WSDL'yi önbelleğe alarak performansı iyileştirme konusunda başarılı olduk. Ancak bunun bizim için çirkin bakım ve paketleme etkileri var.

Proxy fabrikasının kendisini önbelleğe almanın uygunluğunu araştırmak istiyorum. Güvenli midir, ör., Aynı JVM üzerinde yürütülen ve aynı web servisini hedefleyen iki farklı istemci sınıfı, farklı proxy nesnelerini (ya da paylaşılan, reentrant olanı) elde etmek için aynı fabrikayı güvenle kullanabilir mi?

JAX-WS belirtiminden ya da javax.xml.ws API belgelerinden kılavuz bulamadık. Fabrika-proxy çokluğu benim için net değil. Service.createPort yerine Service.getPort sahip olmak güven ilham vermez.

cevap

2

10000 bağlantı noktasını saniyenin bir kesimi olabilir, bu nedenle hizmeti depolamak iyi bir fikirdir. Ayrıca wsdl yerel saklamak ve daha sonra bitiş noktasını değiştirmek mümkündür.

Örnek 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); 
    }  
} 
İlgili konular