3
我正在使用Netty編寫一個簡單的反向代理。因爲我不想處理的原始字節自己,我已經添加了一個請求解碼器和目標聚集到處理管道,以及一個響應編碼器,最後我自己的處理程序,像這樣如何在netty中處理大於1024字節的http請求?
ChannelPipeline p = ch.pipeline();
p.addLast(new HttpRequestDecoder());
p.addLast(new HttpObjectAggregator(MAX_CONTENT_LENGTH));
p.addLast(new HttpResponseEncoder());
p.addLast(new FrontendHandler(...));
我FrontendHandler
延伸SimpleChannelInboundHandler<HttpRequest>
,所以它有一個
// Start reading as soon as a request comes in...
public void channelActive(ChannelHandlerContext ctx) {
ctx.read();
}
和
protected void channelRead0(ChannelHandlerContext ctx, HttpRequest request) {
// copy request, fix headers, forward to backend server
}
會發生什麼情況是,服務器掛起,如果收到請求時瓦亭大於1024字節(例如,它有一些餅乾)。通過一些試驗和錯誤,我發現如果我在處理程序上設置ChannelOption.AUTO_READ
一切正常,所以它看起來像我的舊代碼丟失了ctx.read()
調用某處,但我不知道在哪裏。如果我這樣做
@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
ctx.read();
}
然後我得到了channelRead0
內部異常,似乎被處理的是一個仍然是不完整的HTTP請求,哪一種違背了使用請求解碼器/對象聚合的目的是原因。我錯過了什麼?
查收這可能有幫助... http://stackoverflow.com/questions/10170564/in-netty-we-can-only-write -and-接收數據低於1024bytes知識,我們燦WRI/11373405#11373405 –