Java 如何确保';channelRead';每次调用一次';阅读';烦躁
我正在用Netty编写HTTP代理服务器 我希望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
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
,大多数解码器也会自动执行读取
,因为它们需要读取足够的数据,以便向后续(即您的)处理程序生成至少一条消息。。。但在它们产生消息后,它们不会再次从套接字自动读取。