
Пользовательским агентом является XML-WS Runtime 4.0.0.

Обратите внимание, что на изображении выше 100.64.0.1 является клиентом, и это инициирование FIN.
В отдельном тестовом проекте я использую Spring-WS-core для кода на стороне клиента. Мой клиент расширяет класс WebServiceGatewaySupport, и я создаю компонент, как показано ниже:
Код: Выделить всё
@Bean
public CountryClient countryClient(Jaxb2Marshaller marshaller, HttpComponentsMessageSender messageSender) {
CountryClient client = new CountryClient();
client.setDefaultUri("http://localhost:8043/ws");
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
client.getWebServiceTemplate().setMessageSender(messageSender);
return client;
}
@Bean
public HttpComponentsMessageSender httpComponentsMessageSender() {
HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender();
messageSender.setConnectionTimeout(5 * 60 * 1000); // 5 minutes
messageSender.setReadTimeout(5 * 60 * 1000); // 5 minutes
return messageSender;
}

Агент пользователя изменен на Apache-HttpClient, и TCP-соединение не закрывается клиент сторона.
Мне хотелось посмотреть, смогу ли я использовать тот же HTTP-клиент в JAX-WS, поэтому я попробовал следующее предложение, с которым столкнулся, но оно, похоже, не работает:
р>
Код: Выделить всё
// None of the following timeout have any effect on keep-alive
bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 5*60*1000);
bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 5*60*1000);
bindingProvider.getRequestContext().put("javax.xml.ws.client.connectionTimeout", 5*60*1000);
bindingProvider.getRequestContext().put("javax.xml.ws.client.receiveTimeout", 5*60*1000);
// Add HTTP client transport settings
CloseableHttpClient httpClient = createHttpClient();
// Use Apache HttpClient for requests
HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender();
messageSender.setConnectionTimeout(5 * 60 * 1000); // 5 minutes
messageSender.setReadTimeout(5 * 60 * 1000); // 5 minutes
messageSender.setHttpClient(httpClient);
// Assign the message sender to the BindingProvider
bindingProvider.getRequestContext().put("com.sun.xml.ws.transport.http.client.HttpTransportPipe.messageSender", messageSender);
bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.messageSender", messageSender);
Однако, когда агентом пользователя является Apache-HttpClient< /code>, флаг поддержания активности и тайм-аут, установленные клиентом, учитываются, и TCP-соединение остается открытым, а не закрывается клиентом.
На стороне сервера я знаю, что могу настроить сервер Тайм-аут поддержания активности, и это, кажется, работает, но в реальном сценарии я не имею контроля над сервером. Вместо этого я хочу, чтобы JAX-WS вёл себя аналогично Apache-HttpClient.
Вопрос Как изменить пользовательский агент JAX-WS на Apache-HttpClient< /code> или как я могу заставить JAX-WS не закрывать TCP-соединение от клиента? Мне нужно только решение, которое работает на стороне клиента, а не на стороне сервера.
Подробнее здесь: https://stackoverflow.com/questions/793 ... tion-alive
Мобильная версия