#java #http #sockets #jakarta-ee
#java #http #сокеты #джакарта-ee
Вопрос:
Мне нужно отправить несколько запросов на сторону сервера и получить ответ, иногда, когда я вызываю определенный метод для запуска следующего общего кода, я получаю одну ошибку в строке (addToCookieJar (connection);), есть идеи, как это произошло?
URL url = new URL(providerURL);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestProperty("Content-Type", "application/octet-stream");
// We understand gzip encoding
connection.addRequestProperty("Accept-Encoding", "gzip");
if (cookie != null amp;amp; cookieHandler != null) {
connection.setRequestProperty("Cookie", cookie);
}
if (cookieHandler == null) {
addFromCookieJar(connection);
}
// Send the request
ObjectOutputStream oos = new ObjectOutputStream(connection.getOutputStream());
oos.writeObject(remote.getName());
oos.writeObject(m.getName()); // method name
oos.writeObject(m.getParameterTypes()); // formal parameters
oos.writeObject(args); // actual parameters
oos.flush();
oos.close();
if (cookieHandler == null) {
cookieJar.put(new URI(providerURL), connection.getHeaderFields());
}
Исключение:
java.lang.reflect.UndeclaredThrowableException
at $Proxy0.updateDocument(Unknown Source)
at com.agst.ui.gantt.GanttPanel.doUpdateDocument(GanttPanel.java:1931)
at com.agst.ui.gantt.GanttPanel.save(GanttPanel.java:1419)
at com.agst.ui.gantt.GanttPanel$4.run(GanttPanel.java:1673)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at com.agst.rmi.RemoteCallHandler.call(RemoteCallHandler.java:196)
at com.agst.rmi.RemoteCallHandler.invoke(RemoteCallHandler.java:142)
... 5 more
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getHeaderFields(Unknown Source)
at com.agst.rmi.RemoteCallHandler.addToCookieJar(RemoteCallHandler.java:529)
at com.agst.rmi.RemoteCallHandler.call(RemoteCallHandler.java:192)
... 6 more
Комментарии:
1. Я видел, что сброс соединения отображается из-за ошибки в балансировщике нагрузки F5. Если возможно, попробуйте проверить подключение как можно более напрямую (например, нет Apache, нет балансировщика нагрузки) и посмотреть, сможете ли вы воспроизвести проблему. Например, появляется ли это при общении с локальным котом? Как насчет локального кота на следующей машине?
2. Можете ли вы подробнее рассказать об ошибке балансировщика нагрузки F5? Я думаю, что у меня такая же проблема с F5. Есть ли у вас дополнительная информация об этой ошибке (версия F5, ошибка в каком-либо трекере проблем и т.д.) Спасибо!
Ответ №1:
Эта ошибка указывает на то, что удаленная сторона закрыла соединение, в то время как ваша сторона все еще пыталась прочитать из него. Вы должны проверить, является ли
- на сервере проблема (проверьте ее журналы) или
- вы пытаетесь прочитать больше данных, чем предоставляет сервер
Комментарии:
1. На удаленной стороне я использую защищенный void doPost (запрос HttpServletRequest, ответ HttpServletResponse) для обработки этого. И все исключения перехватываются. Я думаю, что у этого не должно быть какой-либо проблемы
2. Это не второе из них. Исключение возникает внутри
parseHTTPHeader
метода.3. спасибо, я следую методу connection.getHeaderFields()), он не вызывает метод parseHTTPHeader внутренне
4. еще один вопрос, если моей серверной логической программе требуется длительное время, возможно ли, что я получаю это исключение.
Ответ №2:
Что делает addToCookieJar
метод? Передача объекта connection может быть проблемой для этого метода, поскольку вы закрываете OutputStream
полученный из соединения. Вы случайно не пытаетесь извлечь объект выходного потока и работать с ним в методе addToCookieJar?
Комментарии:
1. метод addToCookieJar выполняет: cookieJar.put(новый URI(providerURL), connection.getHeaderFields()); когда connection.getHeaderFields() не считывает OutputStream
2. @Jammy: Я все еще думаю, что проблема связана с переданным объектом Connection. Можете ли вы попробовать добавить в cookie jar перед закрытием выходного потока и протестировать его?
3. Спасибо, я попробую, но я также не понимаю, почему эта ошибка иногда возникает при запуске какого-то определенного метода.