2016-02-29 94 views
0

我正在使用jetty-9。Jetty不關閉超時連接

我的配置是:connector.setIdleTimeout(20000)

我的碼頭處理程序是:

public void handle(String target, Request baseRequest, 
     HttpServletRequest request, HttpServletResponse response) 
     throws IOException, ServletException { 
    // TODO Auto-generated method stub 


    AsyncContext ctx = request.startAsync(); 
    ctx.setTimeout(0); 

    XXXXX...(Other process with ctx) 
} 

但30s後,碼頭只是打印日誌,如:

DEBUG [org.eclipse.jetty.io.WriteFlusher]: ignored: [email protected]{IDLE} java.util.concurrent.TimeoutException: Idle timeout expired: 20004/20000 ms 

DEBUG [org.eclipse.jetty.io.AbstractEndPoint]: Ignored idle endpoint [email protected]{/127.0.0.1:59889<->8088,Open,in,out,-,-,20005/20000,HttpConnection}{io=0/0,kio=0,kro=1} 

連接沒有關閉,但active.And我仍然可以使用 「CTX」發送rsp給客戶端。
任何人都可以幫助我嗎?

+0

什麼特定版本的Jetty 9? –

+0

謝謝!碼頭版本是9.3.5.v20151012。 – carydu

回答

2

這裏的行爲將取決於XXXX處理的作用。如果XXXX處理仍在運行,那麼AsyncContext超時將不會觸發,因爲只有在分派給servlet的線程返回到容器後纔會激活AsyncContext超時。

因此,如果XXX正在做很多東西或睡覺,那麼超時將不起作用。

此外javadoc說超時0或更少意味着沒有超時!所以嘗試超時(1)或一些小值。

編輯: 此外,一旦調度了servlet,連接器空閒超時僅適用於阻止IO操作。因此,如果您沒有使用阻止API讀取或寫入,則連接器空閒超時也不適用。

servlet規範基本上信任servlet永遠不會無限 - 容器不允許在處理時間上施加空閒超時。很久以前,Jetty在這種情況下曾經打斷過servlet,但我們毫不猶豫地被告知它違反了規範。

+0

非常感謝! (1)AsyncContext的timeout = 0,我的目的是在我的應用程序中自己控制超時,例如:發送帶有timeout_errorcode(2)的rsp「XXXX handling」很簡單:ResponseFuture future = dispatcher.dispatch(ctx); future.setListener(回調); baseRequest.setHandled(真);因此,「handle」方法將很快返回,應用程序的線程池將獲得rsp並調用回調函數(發送給客戶端)(3)而且,如果我想關閉過期的連接,我該怎麼辦?如果客戶端沒有關閉連接,服務器將耗盡socket_fd。期待您的指導! – carydu