Веб-служба Axis зависает, так как не возвращается закрытие соединения - PullRequest
1 голос
/ 26 октября 2009

У меня есть клиент веб-службы Axis 1.4 (с Spring), использующий веб-службу PHP (работает на Apache). Это прекрасно работает в среде разработки, но в производственной среде выполнение кода зависает где-то в библиотеке Axis сразу после того, как клиент получил ответ SOAP. Я определил в Wireshark, что единственное отличие от точки зрения клиента состоит в том, что в среде разработки HTTP-заголовок ответа SOAP содержит запись


Connection: close

, чего нет в производственной среде. Я предполагаю, что это причина того, что выполнение кода зависает, потому что Axis ожидает поле заголовка закрытия соединения.

Могу ли я что-то исправить, настроив клиент? В противном случае приветствуются любые советы по настройке Apache + PHP для правильного закрытия соединения.

Ответы [ 2 ]

4 голосов
/ 26 октября 2009

Попробуйте установить системное свойство -Dhttp.keepAlive = false в вашем приложении, если можете позволить себе отключить сохранение в других частях приложения. Это предотвратит некоторые зависания с внутренним классом Java HttpClient, который будет пытаться заполнить BufferedInputStream из открытого соединения.

Подробнее см. Также http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4479751.

Если это поможет вам взглянуть на трассировку стека вашего зависшего клиента, он должен выглядеть следующим образом:

java.lang.Thread.State: RUNNABLE в java.net.SocketInputStream.socketRead0 (собственный метод) в java.net.SocketInputStream.read (SocketInputStream.java:129) at java.io.BufferedInputStream.fill (BufferedInputStream.java:218) в java.io.BufferedInputStream.read1 (BufferedInputStream.java:258) at java.io.BufferedInputStream.read (BufferedInputStream.java:317) - заблокирован <0xab82fa30> (a java.io.BufferedInputStream) на sun.net.www.http.HttpClient.parseHTTPHeader (HttpClient.java:687) на sun.net.www.http.HttpClient.parseHTTP (HttpClient.java:632) на sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection.java:1072) - заблокировано <0xab82c838> (sun.net.www.protocol.http.HttpURLConnection)

Параметр http.keepAlive, по сути, гарантирует, что HttpClient всегда будет отправлять сообщение «соединение: закрыть», как рекомендует HeavyWave.

2 голосов
/ 26 октября 2009

Вы можете попробовать отправить заголовок Http "Connection: close" с вашим запросом.

...