Создание постоянных соединений с помощью Spring-WS клиента - PullRequest
1 голос
/ 11 августа 2011

Я использую клиент spring-ws для вызова веб-службы в двухстороннем режиме ssl.Мне нужно убедиться, что я не создаю новое соединение каждый раз - вместо этого я снова использую соединения.Я провел некоторый повторный поиск и обнаружил, что по умолчанию HTTP 1.1 всегда создает постоянные соединения http (s).Это правда?

Нужен ли какой-нибудь фрагмент кода в моем клиенте для обеспечения постоянства соединений?Как я могу проверить, являются ли соединения постоянными или создается новое соединение, когда я посылаю новый запрос?

<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oxm="http://www.springframework.org/schema/oxm"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd">   

    <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/>   
    <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">   
        <constructor-arg ref="messageFactory"/>   
        <property name="marshaller" ref="jaxb2Marshaller" />   
        <property name="unmarshaller" ref="jaxb2Marshaller" />   
        <property name="messageSender" ref="httpSender" />   
    </bean>   

    <bean id="httpSender" class="org.springframework.ws.transport.http.CommonsHttpMessageSender">   
    </bean>   

    <oxm:jaxb2-marshaller id="jaxb2Marshaller" contextPath="com.nordstrom.direct.oms.webservices.addressval" />   

    <bean id="Client" class="test.ClientStub">   
          <property name="webServiceTemplate" ref="webServiceTemplate" />    
   </bean>   
</beans>

1 Ответ

1 голос
/ 08 сентября 2011

HTTP / 1.1 имеет поддержку активности соединения, но сервер может решить закрыть его после нескольких запросов или не поддерживает поддержку активности

Самый простой способ проверить это использовать tcpdump или wireshark и проверитьдля SYN [S] флагов.Это новые подключения.

Я использую следующее и на J2SE 1.6 jdk он не создавал новых сокетов для нескольких запросов.Сервер не отправил заголовок Connection: Keep-Alive, но все равно соединения остались живыми.

Конфигурация компонента :

<bean id="wsHttpClient" factory-bean="customHttpClient"
    factory-method="getHttpClient" />


 <bean id="messageSender"
        class="org.springframework.ws.transport.http.CommonsHttpMessageSender"
        p:httpClient-ref="wsHttpClient" />

Java Code :

import org.apache.commons.httpclient.*;

import org.springframework.stereotype.*;

@Component public class CustomHttpClient {

    private final HttpClient httpClient;

    public CustomHttpClient() {
        httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());
        httpClient.getParams().setParameter("http.protocol.content-charset",
            "UTF-8");
        httpClient.getHttpConnectionManager().getParams()
            .setConnectionTimeout(60000);
        httpClient.getHttpConnectionManager().getParams().setSoTimeout(60000);
        httpClient.setHostConfiguration(new HostConfiguration());
    }

    public HttpClient getHttpClient() {
        return httpClient;
    }
}
...