1

Jetty HttpClient を使用して、本文が数 MB 程度の POST リクエストを送信します。Jetty にリクエストのストリーミングをできるだけ早く開始してもらいたいので、setRequestContentSourceメソッドを使用します。

問題は、比較的小さな値 (4096 など) を返す available() メソッドで入力ストリームを使用すると、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)

これは決定論的ではなく、ストリームの read() メソッドに Thread.sleep(10) を配置すると問題が解決するようです。このエラーは、パイプされたストリームが使用されている場合にも修正できます。これら 3 つのことから、これはある種の競合状態であると思われます。

これは Jetty のバグだと思いますが、そのようなシナリオで奇妙なことをしていないかどうかを確認したいと思います。

4

1 に答える 1

0

特にプロキシを通過してマルチパートを実行しているときに、これをたくさん取得します。

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

私はこれがそれをストリーミングしないことを知っています、それはあなたがしたいことです、しかし私にとってそれが機能するように私が投稿しているファイルに上限があります。

于 2012-01-04T07:40:18.833 に答える