2014-12-15 2 views
2

Мы реализовали клиент JAX-WS и столкнулись со следующей проблемой. Это синхронизированный поток синхронизации сеанса. Клиент делает два запроса/ответа сначала один на один УстпешноКлиент JAX-WS закрывает соединение tcp с FIN, ACK

3 различных случаях для выдачи

1) После первого два запроса/ответа, я делаю третий запрос, который после того, как 6-й и 9-й (два разных теста) через несколько секунд после получения ответа второго запроса. В обоих случаях из tcpdump я мог видеть, что наш клиент закрывает существующее соединение tcp с помощью [FIN, ACK] и открывает новое соединение для третьего запроса. Но поскольку это сеанс с состоянием, сервер ожидает, что соединение не должно быть закрыто, и поэтому мы получаем ответ об ошибке.

2) Если я сделаю третий запрос в течение 5 секунд после второго запроса, повторное использование того же соединения tcp.

3) Если я не делаю 3-й запрос на всех, а затем automatcially через 10 секунд (по [FIN, ACK] из 2-го запроса, TCP conenction закрыт клиентом.

В основном проблема клиента приложение закрывает соединение TCP сам по себе. Я попытался, установив все следующие свойства. Но все-таки я столкнулся с той же проблемой.

BindingProvider bp = (BindingProvider)port; 
    Map<String, Object> context = bp.getRequestContext(); 
    context.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true); 

    context.put(JAXWSProperties.CONNECT_TIMEOUT, 60000); 
    context.put(JAXWSProperties.REQUEST_TIMEOUT, 70000); 

    context.put("com.sun.xml.ws.connect.timeout", 50000); 
    context.put("com.sun.xml.ws.request.timeout", 50000); 

    context.put("javax.xml.ws.client.connectionTimeout", 60000); 
    context.put("javax.xml.ws.client.receiveTimeout", 70000); 

Я attching скриншот PCAP файла для справки. Вот вам может видеть [FIN, ACK], выданный клиентом через 6 секунд. enter image description here

Я не уверен, есть ли какая-либо другая конфигурация, которую мне не хватает. Не могли бы вы помочь мне решить эту проблему?

Vesrions: Java: jdk1.6.0_21

Метро: Метро/2,3

HTTP: 1,1

Еще одна вещь, которую я заметил, есть «Connection: Keep-жив «в запросе, но его нет в ответе сервера. Не уверен, что это может быть проблемой.

+0

Hi. У меня такая же проблема, но в моем случае клиентский заглушка закрывает соединение через 15 секунд. Вы нашли решение? –

+0

@IgorZelaya nope .. У меня не было времени, чтобы проверить, как проблема эскалации. Я дал обходное решение, отправив фиктивное сообщение, такое как ping, если нет фактического трафика более 4 или 5 секунд. Таким образом я сохранил соединение от закрытия. – vijayashankard

+0

Вы уверены, что это сам клиент jax-ws, а не прокси-сервер или устройство между клиентом и поставщиком услуг с таймаутом бездействия, например брандмауэром? «Keepalive» или ping также могут избежать этого. Обычно это наблюдается в других сценариях с использованием состояния или повторного использования, таких как пул соединений jdbc. Что делает журнал или отчет о клиенте jax-ws? –

ответ

1

Я пошел в дальнейшее расследование, так как у меня была та же проблема. Я обнаружил, что это поведение по умолчанию HTTP 1.1. из Википедии (persistent connection):

В HTTP 1.1, все соединения считаются стойкими, если не заявлено иначе . 1 HTTP-постоянные соединения не используют отдельные сообщения keepalive, они просто разрешают нескольким запросам использовать одно соединение . Тем не менее, таймаут соединения по умолчанию Apache httpd 1.3 и 2.0 составляет всего лишь 15 секунд 2 [3] и всего 5 секунд для Apache httpd 2.2 и выше.[4] [5] Преимущество короткого тайм-аута способность доставлять несколько компонентов веб-страницы быстро, пока не потребляя ресурсы для запуска нескольких серверных процессов или потоков слишком долго

Поэтому в основном то, что происходит, что ваш клиент закрывает соединение после того, как он простаивает в течение установленного времени (connection-timeout). Jax-ws реализует по умолчанию apache HttpUrlConnection, который имеет предварительно сконфигурированный тайм-аут 15 секунд. В нашем клиенте, работающем на Weblogic 12.1.3, для нас работала следующая конфигурация:

final BindingProvider binding = (BindingProvider) port; 
final Map<String, Object> ctx = binding.getRequestContext(); 
ctx.put("com.sun.xml.ws.request.timeout", requestTimeOut); 
ctx.put("com.sun.xml.ws.connect.timeout", connectTimeOut); 
Смежные вопросы