【问题标题】:Is it safe to reuse javax.xml.ws.Service objects?重用 javax.xml.ws.Service 对象是否安全?
【发布时间】:2011-01-28 18:50:41
【问题描述】:

我有使用 NetBeans IDE 自动生成的 JAX-WS 样式 Web 服务客户端。

生成的代理工厂(扩展 javax.xml.ws.Service)将代理创建委托给各种 Service.getPort 方法。我正在维护的应用程序实例化工厂并在每次调用目标服务时获取代理。

已经证明重复创建新代理工厂实例的成本很高,因为每次实例化都会重新检索提供给工厂构造函数的 WSDL 文档,即 HTTP URI。

我们通过缓存 WSDL 成功地提高了性能。但这对我们的维护和包装影响很大。

我想探索缓存代理工厂本身的适用性。是否安全,例如,在同一个 JVM 上执行并针对同一个 Web 服务的两个不同的客户端类可以安全地使用同一个工厂来获取不同的代理对象(或共享的、可重入的代理对象)?

我无法从 JAX-WS 规范或 javax.xml.ws API 文档中找到指导。我不清楚工厂代理的多样性。拥有 Service.getPort 而不是 Service.createPort 并不能激发信心。

【问题讨论】:

    标签: java web-services jakarta-ee jax-ws


    【解决方案1】:

    您可以在几分之一秒内创建 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 );
        }       
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-17
      • 2012-11-17
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多