2012-06-28 1 views
0

Я работаю над клиентом Java Axis 2 (1.6.1), сгенерированным с помощью wsdl2java.Не удается отправитьViaPost - на клиенте Axis2

Это, кажется, работает хорошо, но время от времени я получаю следующее сообщение об ошибке:

14: 38: 04855 INFO [HTTPSender] Невозможно sendViaPost к URL [...]

java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(SocketInputStream.java:168) 
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293) 
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331) 
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:798) 
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:755) 
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75) 
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 
at java.io.BufferedInputStream.read(BufferedInputStream.java:237) 
at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78) 
at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106) 

Мне интересно, может ли это быть проблемой многопоточности и хотелось бы получить ответы на этот вопрос. Я использую заглушку, которая кэширует HttpClient. HttpClient использует MultiThreadedHttpConnectionManager, и я устанавливаю setDefaultMaxConnectionsPerHost на 20.

Я понимаю, что HttpClient благодаря связанному с ним MultiThreadedHttpConnectionManager будет потокобезопасным. Вопрос в том, что происходит с заглушкой Axis2? Смогут ли заглушки быть потокобезопасными?

Я видел несколько сообщений, на которых указано, что осевые штыри не являются потокобезопасными по дизайну. Если это так, в чем преимущество использования многопоточного HttpClient? Как я могу убедиться, что заглушка клиента Axis применима в многопоточной среде?

Спасибо

ответ

0

A «Подключение сброса» ошибка означает, что сервер закрыл соединение неожиданно. Когда вы получаете эту ошибку, проблема возникает на удаленном сервере, а не на вашем клиенте.

MultiThreadedHttpConnectionManager - многопоточный кеш для HTTP-соединений. Несколько потоков могут извлекать соединения из кеша или возвращать их в кеш без кэша, становясь узким местом. Индивидуальный HttpClient или заглушка, которая владеет HttpClient, должна использоваться только одним потоком за раз. HttpClient имеет фактическое TCP-соединение с удаленным сервером, и это соединение поддерживает только один входящий запрос за раз.

+0

Благодарим за ответ. Думаю, это дает мне некоторое облегчение, если это не проблема с клиентом. –

+0

Предполагая, что заглушка не является потокобезопасной, у меня действительно есть три варианта: 1. Создавать/уничтожать заглушку каждый раз, когда я делаю запрос. 2. Использовать заглушку ThreadLocal или 3. Синхронизировать доступ к общему экземпляру (или пулу экземпляров) заглушки. Опция ThreadLocal имела бы наименее эффективный процессор, но могла значительно увеличить объем памяти на сервере с большими пулами потоков. Остальные два удержали бы объем памяти до минимума, но потребовали бы значительно (?) Большего количества CPU. Основываясь на своем опыте, вы бы рекомендовали один подход? спасибо –