如何确保在Netty中每次“读取”后调用一次“channelRead”

时间:2017-08-25 17:52:05

标签: java netty

我正在Netty中编写HTTP代理服务器。

我希望channelRead只能在我致电read后最多一次被解雇  而且从来没有。换句话说,在我准备好接收消息之前,我不想要channelRead

我已设置AUTO_READ=false。我在ctx.read()(而不是其他地方)拨打channelActive一次。

但是,对于基本curl http://localhost:8080/channelRead处理程序会触发两次:

io.netty.handler.codec.http.DefaultHttpRequest
io.netty.handler.codec.http.LastHttpContent$1

在第二次致电LastHttpContent之前,如何阻止ctx.read()到达?

1 个答案:

答案 0 :(得分:2)

FlowControlHandler解决了这个问题:它专门用于启用此行为。

来自the docs

  

FlowControlHandler确保每read()只有一条消息   送到下游。

     

...

     

这是HttpObjectDecoder的常见问题   经常会发出一个HttpRequest,紧接着是一个。{1}}   LastHttpContent事件。

     

ChannelPipeline pipeline = ...;

     

pipeline.addLast(new HttpServerCodec());

     

pipeline.addLast(new FlowControlHandler());

     

pipeline.addLast(new MyExampleHandler());