代码之家  ›  专栏  ›  技术社区  ›  Noel Ang

重用javax.xml.ws.service对象是否安全?

  •  12
  • Noel Ang  · 技术社区  · 15 年前

    我有使用netbeans ide自动生成的jax-ws风格的web服务客户机。

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

    反复创建新的代理工厂实例被证明是昂贵的,因为为工厂构造函数(一个http uri)提供的wsdl文档是为每个实例重新检索的。

    我们通过缓存wsdl成功地提高了性能。但这对我们的维护和包装有着丑陋的影响。

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

    我无法从jax-ws规范或javax.xml.ws api文档中找到指导。我不清楚工厂代理的多样性。使用service.getport而不是service.createport不会激发信心。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Ricahard van den den berg    14 年前

    您可以在几秒钟内完成10000个端口,因此存储服务是一个好主意。 还可以将wsdl存储在本地,稍后更改端点。

    示例peoplewsdl&peopleendpoint:
    文件/c:/users/richard/workspaces/osb/教学大纲邮件/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 );
        }       
    }