2017-08-25 426 views
1

我正在用Netty編寫HTTP代理服務器。 並沒有其他的時間 -如何確保在每次'讀取'Netty後調用'channelRead'

我想channelRead我打電話read後只能發射最多一次。換句話說,我不想要channelRead,直到我準備好消息。我有AUTO_READ=false。我在channelActive(以及其他地方)撥打ctx.read()一次。

然而,一個基本的curl http://localhost:8080/,該channelRead處理閃光兩次:

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

如何防止LastHttpContent從到達,直到我打電話ctx.read()第二次?

+0

我可能已經找到了解決方案:'FlowControlHandler'道:「'FlowControlHandler'確保每'只讀一個消息( )'發送到下游。「...晚餐後將檢查出來:D –

回答

2

FlowControlHandler解決了這個問題:它是專門爲了實現這種行爲而設計的。

the docs來自:

FlowControlHandler確保每read()只有一個消息是 下游發送。

...

這與HttpObjectDecoder一個共同的問題,這將非常 常火HttpRequest被後面緊跟一個 LastHttpContent事件。

ChannelPipeline pipeline = ...;

pipeline.addLast(new HttpServerCodec());

pipeline.addLast(new FlowControlHandler());

pipeline.addLast(new MyExampleHandler());

+0

該cl的javadoc中的示例屁股似乎被中途切斷,你有一個例子如何使用它? (具體來說,你還需要在使用該處理程序時調用'setAutoRead') – Ferrybig

+0

在我的情況下,我有'AUTO_READ = false',但這隻意味着「不要從套接字自動讀取」,所以如果編碼器產生接收數據塊的多條消息(例如'HttpDecoder'),那麼您仍然會收到2條或更多條消息到達您的處理程序。在這些情況下,'FlowControlHandler'有幫助。還要注意,即使你有'AUTO_READ = false',大多數解碼器也會自動執行'read',因爲它們需要讀取足夠的數據以便向後續(即你的)處理程序產生至少一條消息......但是在它們屈服之後一條消息,它們不會再次從套接字自動讀取。 –

相關問題