2010-12-06 45 views
1

有沒有辦法找出HttpServletRequest是否中止?在HttpServlet中檢測中止的請求

我正在編寫即時瀏覽器應用程序(某種聊天):客戶端使用AJAX-HTTP請求在循環中要求新事件。服務器(Tomcat)處理HttpServlet中的請求。如果此客戶端沒有新事件,則服務器延遲迴復,直到發生新事件或發生超時(30秒)。

現在我想識別不再輪詢的客戶端。因此,我在一個請求結束時啓動一個kick-Timer,這個請求在新的請求到達時停止。如果客戶端關閉瀏覽器窗口,則TCP連接關閉,並且HTTP請求被中止。

問題:客戶端不會遇到kick-Timeout,因爲Servlet仍然處理事件請求 - 休眠和等待事件或超時。

如果我能以某種方式偵聽連接中止事件,然後通知等待請求以阻止它,那將是非常好的。但我在HttpServletRequest或HttpServletResponse中找不到類似的東西...

+0

您使用什麼API /框架來處理異步請求和/或HTTP推送?你的問題聽起來/讀起來很奇怪,因爲這不是標準的Servlet API正常工作的方式,所以我猜你正在使用一些API /框架來實現它(例如Comet,Atmosphere,Servlet 3.0異步等) 。不是那樣,就是你做的事情完全錯了。 – BalusC 2010-12-06 23:24:20

+0

我沒有使用任何框架。它是如此簡單: ::::::: UpdateServlet的doGet-方法 (1)獲取從updateClient會話 (2)從updateClient (3)打印編碼事件列表獲取。 ::::::: UpdateClient getEvents-方法 (1)等待,如果沒有事件等待 (2)返回事件 ::::::: UpdateClient的addEvent-方法 (1)增加的情況下列表 (2)通知等待線程 這些請求在不同線程中同時處理。 – Escudo 2010-12-06 23:45:51

回答

0

看起來等待請求可能會非常快地降低系統的性能。如果請求處於打開狀態,那麼對請求作出響應的線程會快速用完。您可以嘗試完成所有請求(並在沒有消息的情況下向客戶端返回「null」),並在後端有一個線程,用於跟蹤客戶端輪詢後的時間。該線程可以將客戶端標記爲不活動。

1

您可能正在使用某種線程通知(Semaphores或Object.wait)來保存和釋放Servlet線程。如何在等待中添加一個超時(〜10s),然後以某種方式檢查連接是否仍然存在,然後繼續等待另外10s,如果連接仍然存在。

我不知道是否有可靠的方法來輪詢連接的「活性」(例如,resp.getOutputStream不拋出異常),如果是,哪種方式最好(最可靠,CPU最少) 。