Клиент SOAP JAX-WS не поддерживает соединение TCPJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Клиент SOAP JAX-WS не поддерживает соединение TCP

Сообщение Anonymous »

Я использую JAX-WS 4.x. Когда я делаю вызовы SOAP от своего клиента, я замечаю, что клиентская сторона разрывает TCP-соединение после установленного тайм-аута. В моем HTTP-запросе SOAP я вижу следующие заголовки:
Изображение

Пользовательским агентом является 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;
}
Теперь с этим клиентом на основе Spring-WS, когда я делаю вызов SOAP, я вижу следующее
Изображение

Агент пользователя изменен на 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);
Моя основная проблема заключается в том, что когда пользовательский агент представляет собой среду выполнения XML-WS 4.0.0, клиент не имеет эффекта от флага Keep-Alive и тайм-аута поддержания активности. Он автоматически инициирует FIN после истечения времени ожидания, которое, по-видимому, является значением по умолчанию на стороне сервера, но никогда не передается клиенту. Я знаю это, потому что не вижу никаких тайм-аутов или настроек поддержания активности в заголовках, отправленных в ответе, отправленном сервером.
Однако, когда агентом пользователя является Apache-HttpClient< /code>, флаг поддержания активности и тайм-аут, установленные клиентом, учитываются, и TCP-соединение остается открытым, а не закрывается клиентом.
На стороне сервера я знаю, что могу настроить сервер Тайм-аут поддержания активности, и это, кажется, работает, но в реальном сценарии я не имею контроля над сервером. Вместо этого я хочу, чтобы JAX-WS вёл себя аналогично Apache-HttpClient.
Вопрос Как изменить пользовательский агент JAX-WS на Apache-HttpClient< /code> или как я могу заставить JAX-WS не закрывать TCP-соединение от клиента? Мне нужно только решение, которое работает на стороне клиента, а не на стороне сервера.

Подробнее здесь: https://stackoverflow.com/questions/793 ... tion-alive
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»