2011-03-11 50 views
5

我想實現以下邏輯: 當我收到HttpServletRequeset和HttpServletResponse在主servlet的doService方法(在主Web容器線程中)時,我啓動了A,B,C三個線程(由我自己的程序管理的線程)來處理並行模式下的其他servlet,然後在主線程中加入這些servlet的每個響應,如果我自己的一個線程(假設爲A線程)工作緩慢,主線程將完成,因此主響應將返回給user.and 一個線程必須繼續正常工作,稍後我會在瀏覽器端請求使用AJAX的A線程的響應。如何克隆由Servlet容器提供的分離的HttpServletRequest和HttpServletResponse?

所以,我想克隆由servlet容器提供的HttpServlettRequest和HttpServletResponse,和克隆的請求和響應必須分離(當容器的HttpServletTrequest和HttpServletResponse成品,克隆的請求和效應初探仍然正常工作)。

克隆請求和響應的行爲必須與我的代碼視圖中的容器相同,可以遵循幷包含它。

有什麼想法?

非常感謝!

L.J.W

+1

你不能。期。什麼是功能要求?然後我們可以提供更適合的答案/建議以達到功能要求。 – BalusC 2011-03-11 14:13:57

回答

3

聽起來像是你需要創建類的代表採取行動,HttpRequest中和的HttpResponse對象,然後通過一個參考上一個Runnable對象的過程。

有一些操作只能對HttpRequest對象執行一次(從輸入流中讀取彈出的內容),委託類將不得不迎合這一點。

不知道如果A,B和C線程對HttpResponse對象做出衝突更改,你會怎麼做。

我想我寧願不通過傳遞HttpResponse對象的處理線程,離開邏輯用於填充在控制servlet類

+0

我想克隆的請求和響應可以分離,所以我不能通過引用(等等,我不能使用wrap方法) – 2011-03-11 13:55:38

+1

@LJW:你說什麼都沒有意義。 「我不能通過引用」,那麼你一定不能使用Java ... – 2011-03-11 14:24:47

+1

@ L.J.W你可以想,但你不會在收到響應時使用響應是未定義的行爲。換句話說,它會崩潰,因爲流(可能)已關閉)。 – extraneon 2011-03-11 14:53:03

2

我想你問得多HttpServletRequest的響應。請求完成後,您不應該指望請求對象有任何用處。無論如何,我不建議在大多數情況下在J2EE容器內進行線程化,但這是一個不同的問題。

如果必須並行處理的要求,我建議您提取您從請求對象所需要的數據和發送到你的線程,使工作線程大多Servlet的無知與在那裏他們可以存儲在HttpSession除外他們的計算值爲Ajax檢索。

+0

線程必須處理servletrequest和響應,我不能發送其他數據類型.. – 2011-03-11 13:58:38

+0

@ L.J.W換句話說,您需要實現一個自定義的HttpRequest和HttpResponse,並使用從給定的請求和響應複製的數據來初始化它。不要複製這些流,因爲這是行不通的。 – extraneon 2011-03-11 14:54:41

3

請求和響應類不旨在從多個線程克隆或訪問。如果你嘗試這樣做,你一定會遇到問題。我建議你重新考慮你的要求。

5

通過HttpServletResponseWrapper類http://docs.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServletResponseWrapper.html克隆HTTP請求和響應是可能的。您可以在Sun文檔https://web.archive.org/web/20120626033905/http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets8.html上找到使用示例。

注意,這是Sun(當時)解決此問題的一種解決方法,因爲從未計劃您可以在提交之前修改請求和響應信息。

您可以使用包裝來製作Http信息的副本並將其傳遞給不同的線程。

相關問題