当Jetty EndPoint.flash(ByteBuffer b)返回false时该怎么办



我第一次使用Jetty 9 EndPoint
但是我被困在如何使用EndPoint.flash(ByteBuffer)方法返回代码的问题上
我应该无限循环直到调用成功吗?

Javadoc只是说

返回:True IFF所有缓冲区都已消耗,端点已将数据刷新到其目的地(即不缓冲任何数据)。

顺便说一下,我调用的实例的类型是SslConnection$DecryptedEndPoint

任何见解都值得赞赏,因为我找不到任何文档来说明为什么不鼓励使用SocketEndpoint,而首选SelectChannelEndpoint。


有点离题,但无论如何;令我惊讶的是,我在NetworkTrafficSelectChannelEndPoint中发现了这一点:
使用了运算|=而不是&=(在jetty-all-9.0.3.v220130506 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;
}

EndPoint.flush()如果不能写入整个缓冲区,则返回false。因此,调用者知道它必须再次调用flush,直到所有数据都写入EndPoint。

看一下WriteFlusher.write()和WriteFlusher.completeWrite(),并阅读那里的javadocs,了解一下它是如何使用的。

关于线路:flush|=超级flush(b);//<lt;--不应该是&=

我想你是对的。flush被初始化为true,因此将始终为true。我会仔细检查并可能修复它。

相关内容

  • 没有找到相关文章

最新更新