Java 如何确保';channelRead';每次调用一次';阅读';烦躁

Java 如何确保';channelRead';每次调用一次';阅读';烦躁,java,netty,Java,Netty,我正在用Netty编写HTTP代理服务器 我希望channelRead在我调用read-- 没有别的时间了。换句话说,在我准备好接收消息之前,我不想启动channelRead 我已经设置了AUTO\u READ=false。我在channelActive中调用ctx.read() 但是,对于基本的curlhttp://localhost:8080/,channelRead处理程序触发两次: io.netty.handler.codec.http.DefaultHttpRequest io.net

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

我希望
channelRead
在我调用
read
-- 没有别的时间了。换句话说,在我准备好接收消息之前,我不想启动channelRead

我已经设置了
AUTO\u READ=false
。我在
channelActive
中调用
ctx.read()

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

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

在我第二次调用
ctx.read()
之前,如何防止
LastHttpContent
到达?

FlowControlHandler
解决了这个问题:它是专门为启用此行为而设计的

发件人:

FlowControlHandler
确保每个
read()
只显示一条消息 顺流而下

这是HttpObjectDecoder的一个常见问题,它将非常有用 经常触发一个紧接着一个
LastHttpContent
事件

管道管道=

pipeline.addLast(新的HttpServerCodec())

pipeline.addLast(新的FlowControlHandler())

pipeline.addLast(新的MyExampleHandler())


我可能已经找到了解决方案:
FlowControlHandler
:“FlowControlHandler
确保每个
read()
只向下游发送一条消息。”。。。晚饭后我会查看:D该类的javadoc中的示例似乎中途中断,您有如何使用它的示例吗?(具体来说,我是否在使用该处理程序时仍然需要调用
setAutoRead
)在我的例子中,我有
AUTO\u READ=false
,但这只意味着“不要从套接字自动读取”,因此如果编码器为接收到的数据块生成多条消息(例如
HttpDecoder
)然后,处理程序仍然会收到2条或更多消息。在这些情况下,
FlowControlHandler
会有所帮助。还要注意的是,即使您有
AUTO_read=false
,大多数解码器也会自动执行
读取
,因为它们需要读取足够的数据,以便向后续(即您的)处理程序生成至少一条消息。。。但在它们产生消息后,它们不会再次从套接字自动读取。