在Netty 4中,proxy example的AUTO_READ已关闭,根据this answer,这是为了使向代理发送大量数据的通道不会占用过多的缓冲区,这很有意义
但是,我的理解是,在HTTP / 2中,您永远不应延迟读取,而应该逐流处理流控制。不过,我不知道如何在Netty中做到这一点。
感觉应该通过在onDataRead
上的Http2ConnectionHandler
中返回0来实现。以下人为设计的示例是我预期的工作方式,其中100ms的字节未消耗:
@Override
public int onDataRead(ChannelHandlerContext ctx, int streamId, ByteBuf data,
int padding, boolean endOfStream) throws Http2Exception {
int processed = data.readableBytes() + padding;
Http2LocalFlowController flowController = decoder().flowController();
Http2Stream stream = connection().stream(streamId);
executorService.schedule(() -> {
ctx.executor().execute(() -> {
try {
// ...do stuff...
flowController.consumeBytes(stream, processed);
} catch (Http2Exception e) {
e.printStackTrace(); // now what?
}
});
}, 100, TimeUnit.MILLISECONDS);
return 0;
}
使用此选项时,不会引发任何异常,并且客户端只会超时。因此,我假设调用consumeBytes
不会导致发送WINDOW_UPDATE
帧。 (请注意,如果我在返回之前调用consumeBytes
调用,即不在另一个线程中,那么它确实起作用。)
即使这样做确实可行,DefaultHttp2ConnectionDecoder
在异常处理方面也有足够的逻辑,我真的不想重新实现它。那么如何使用Netty限制HTTP / 2中的流读取?