1

初めて Jetty 9 EndPoint を使用しています。
しかし、EndPoint.flush(ByteBuffer)メソッドの returncode の使用方法に行き詰まっています。
呼び出しが成功するまで無期限にループする必要がありますか?

Javadocはただ言う

戻り値: True IFF すべてのバッファが消費され、エンドポイントがデータを宛先にフラッシュした (つまり、データをバッファリングしていない)。

ところで、私が呼び出しているインスタンスのタイプはSslConnection$DecryptedEndPointです

SocketEndpoint が推奨されず、SelectChannelEndpoint が優先される理由に関するドキュメントが見つからないため、洞察をいただければ幸いです。


少し話題から外れますが、とにかく; 驚いたことに、NetworkTrafficSelectChannelEndPointでこれを見つけました:
操作 |= が &= の代わりに使用されます (jetty-all-9.0.3.v20130506-sources.jar にあります)。

@Override
public boolean flush(ByteBuffer... buffers) throws IOException
{
    boolean flushed=true;
    for (ByteBuffer b : buffers)
    {
        if (b.hasRemaining())
        {
            int position = b.position();
            flushed|=super.flush(b); // <<-- shouldn't it be &=
            int l=b.position()-position;
            notifyOutgoing(b, position, l);
            if (!flushed)
                break;
        }
    }
    return flushed;
}
4

1 に答える 1

1

EndPoint.flush() は、バッファ全体を書き込めなかった場合に false を返します。したがって、呼び出し元は、すべてのデータが EndPoint に書き込まれるまで、再度フラッシュを呼び出す必要があることを認識します。

WriteFlusher.write() と WriteFlusher.completeWrite() を見て、そこにある javadoc を読んで、それがどのように使用されているかを感じてください。

行について: flushed|=super.flush(b); // <<-- そうじゃない &=

私はあなたが正しいと思います。flushed は true に初期化されるため、そのように常に true になります。私は再確認し、場合によっては修正します。

于 2013-07-03T15:52:31.130 に答える