Подтвердить что ты не робот

Можно ли повторно использовать объекты javax.xml.ws.Service?

У меня есть клиент веб-службы стиля JAX-WS, который был автоматически сгенерирован с помощью среды IDE NetBeans.

Сгенерированный прокси factory (extends javax.xml.ws.Service) делегирует создание прокси различным методам Service.getPort. Приложение, которое я поддерживаю, создает экземпляр factory и получает прокси каждый раз, когда он вызывает целевую услугу.

Было показано, что создание новых экземпляров proxy factory было дорогостоящим, учитывая, что документация WSDL, поставляемая конструктору factory, HTTP URI, повторно извлекается для каждого экземпляра.

У нас был успех в улучшении производительности путем кэширования WSDL. Но это имеет уродливое обслуживание и последствия для упаковки для нас.

Я хотел бы изучить пригодность кэширования прокси-сервера factory. Безопасно ли, например, два разных клиентских класса, выполняющихся на одной и той же JVM и нацеленных на один и тот же веб-сервис, безопасно использовать один и тот же factory для получения отдельных прокси-объектов (или общего, повторного)?

Мне не удалось найти руководство ни из спецификации JAX-WS, ни из документации javax.xml.ws API. Множество factory -proxy для меня непонятно. Наличие Service.getPort, а не Service.createPort не внушает доверия.

4b9b3361

Ответ 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 );
    }       
}