Jetty HttpClient падает на POST при использовании потоков с методом available (), возвращающим относительно небольшие значения - PullRequest
1 голос
/ 15 марта 2011

Я использую Jetty HttpClient для отправки запроса POST с объемом тела около нескольких МБ. Я хочу, чтобы Jetty начал потоковую передачу запроса как можно скорее, поэтому я использую метод setRequestContentSource .

Проблема в том, что когда я использую любой поток ввода с методом available (), возвращающим относительно небольшое значение (например, 4096), Jetty иногда вылетает со следующей ошибкой:


org.eclipse.jetty.io.EofException
    at org.eclipse.jetty.http.HttpGenerator.flushBuffer(HttpGenerator.java:911)
    at org.eclipse.jetty.client.HttpConnection.handle(HttpConnection.java:241)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:520)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:528)
    at java.lang.Thread.run(Thread.java:680)
Caused by: 
java.io.IOException: Broken pipe
    at sun.nio.ch.FileDispatcher.write0(Native Method)
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:29)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:100)
    at sun.nio.ch.IOUtil.write(IOUtil.java:71)
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:334)
    at org.eclipse.jetty.io.nio.ChannelEndPoint.flush(ChannelEndPoint.java:195)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.flush(SelectChannelEndPoint.java:285)
    at org.eclipse.jetty.io.nio.ChannelEndPoint.flush(ChannelEndPoint.java:316)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.flush(SelectChannelEndPoint.java:267)
    at org.eclipse.jetty.http.HttpGenerator.flushBuffer(HttpGenerator.java:846)
    at org.eclipse.jetty.client.HttpConnection.handle(HttpConnection.java:241)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:520)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:528)
    at java.lang.Thread.run(Thread.java:680)

Это недетерминировано, и кажется, что помещение Thread.sleep (10) в метод read () потока решает проблему. Эта ошибка также может быть исправлена ​​при использовании потоковых каналов. Эти три вещи заставляют меня думать, что это какое-то состояние гонки.

Полагаю, это ошибка в Jetty, но я хочу быть уверенным, что я не делаю ничего странного в таком сценарии.

1 Ответ

0 голосов
/ 04 января 2012

Я часто получаю это, когда просматриваю прокси и выполняю многочастную часть.

Buffer okBuffer = new ByteArrayBuffer(IOUtils.toByteArray(streamToTranslate));
exchange.setRequestContent(okBuffer);

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

...