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

2022-09-04 04:50:00

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

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

重复创建新的代理工厂实例已被证明是昂贵的,因为提供给工厂构造函数的 WSDL 文档(HTTP URI)在每次实例化时都会被重新检索。

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

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

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


答案 1

您可以在几分之一秒内实现10000个端口,因此存储服务是个好主意。还可以将 wsdl 存储在本地,并在以后更改端点。

例如 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 );
    }       
}

答案 2

推荐