【问题标题】:What to do when Jetty EndPoint.flush(ByteBuffer b) returns false?Jetty EndPoint.flush(ByteBuffer b) 返回false怎么办?
【发布时间】:2013-07-03 14:19:04
【问题描述】:

我是第一次使用 Jetty 9 EndPoint。
但我不知道如何使用 EndPoint.flush(ByteBuffer) 方法返回码。
我应该无限循环直到调用成功吗?

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;
}

【问题讨论】:

    标签: java jetty endpoint embedded-jetty jetty-8


    【解决方案1】:

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

    查看 WriteFlusher.write() 和 WriteFlusher.completeWrite() 并阅读其中的 javadocs 以了解其使用方式。

    关于线路: 刷新|=super.flush(b); //

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

    【讨论】:

    猜你喜欢
    • 2014-03-03
    • 2017-08-11
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2023-03-26
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多