簡體   English   中英

Http服務器-Netty FileRegions是否可重用?

[英]Http Server - Are Netty FileRegions reusable?

我目前正在使用http服務器,有些事情表現得有些奇怪。 我想生成動態內容,還只提供靜態文件。 提供動態生成的內容可以正常工作。 因為我想從零拷貝中獲利,所以我使用FileRegions來提供靜態文件。 我的頻道管道包含以下處理程序(按此順序):

  1. HttpRequestDecoder
  2. HttpResponseEncoder
  3. HttpObjectAggregator
  4. ApiMapper

ApiMapper是可共享的,並且從SimpleInboundHandler派生。 創建時,ApiMapper從靜態文件創建FileRegion。 現在,每次請求“ /” uri都會發生:

  1. DefaultHttpReponse寫入ChannelHandlerContext。 DefaultHttpReponse不會重用,它包含Content-Type和Content-Length的標頭
  2. FileRegion的ReferenceCount使用其keep方法增加。 然后,使用FileRegion作為參數在ChannelHandlerContext上調用writeAndFlush。 向返回的ChannelFuture中添加一個ChannelFutureListener,它顯示“ DONE”。

第一個響應將按預期工作,瀏覽器將獲取完整文件並正確顯示它,並打印“ DONE”。 但是,如果再次調用“ /” uri,瀏覽器將不會顯示任何內容,而是永遠加載,但會打印“ DONE”。 然后,在重新啟動服務器后,我使用telnet手動進行呼叫。 第一個響應是正確的,但是隨后我注意到第二個調用僅返回標頭,但沒有內容。 “完成”仍然被打印。

所以我的問題是:同一個FileRegion對象可以多次使用嗎? 我還有其他錯嗎?

不,您不能多次寫入同一個FileRegion,因為在DefaultFileRegion對象上更新了transferred狀態。 您將需要為此處的每次寫入創建一個新的DefaultFileRegion實例。

另外,您還需要確保在LastHttpContent之后發送FileRegion ,否則在編寫第二個HttpResponseHttpResponseEncoder的狀態機將不會處於正確的狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM