2013-03-05 71 views
0

我有一個服務從多個客戶端獲取請求,並在某些處理向客戶端發送響應之後。我使用ThreadPoolExecutor(threadExecuterClient)來處理客戶端請求,並將它們放在BlockingQueue(requestQueue)中。許多客戶端可以發送併發請求。我有另一個ThreadPoolExecutor(threadExecuterServer)處理requestQueue中的請求。這個處理過程基本上是把這個請求發送到服務器並得到響應。處理完成後,我需要將該響應發送給發出請求的客戶端。我很難跟蹤哪個客戶提出了哪個請求。我基本上需要找到一種方法將客戶端請求映射到處理結果。該服務將像一個網關。Java對許多線程的許多線程關係

任何想法來處理這個問題表示讚賞。

謝謝

+1

您可以在每個請求中附加客戶端ID,並且該請求會像threadExecuterServer一樣接收。在執行請求時,請求可以被分割以獲取客戶端做出的實際請求..並且在處理請求之後將客戶端ID重新附加到響應代碼中。IMO – 2013-03-05 17:40:43

+0

抱歉,您正在尋找一種跟蹤工作的方式?一個簡單的記錄器說明每個執行的處理(請求接受,通過網關處理,響應發送)的請求ID是不夠的? – devlearn 2013-03-05 17:42:23

+0

@VishalK我的第一個直覺就像你的直覺。但是,僅通過附加ID來處理請求就太複雜了。服務器線程始終處於活動狀態,並且它們可以發送請求,因爲隊列中有更多的請求,而無需等待先前請求的響應。對於客戶端線程,每個連接創建一個線程,客戶端可以使用相同的連接發送多個請求,直到客戶端關閉連接。對於最後一部分,我不確定一個連接是否適合多個請求。我可以爲每個請求使用一個唯一的連接。 – celik 2013-03-05 18:31:31

回答

0

我假設你的服務通過HTTP接受請求?接受您的服務請求併發回HTTP 202響應。此響應表示該請求已被接受進行處理。當您發送回覆時,請發送位置標題以告訴客戶端要調用哪個URL以確定您的請求的狀態。客戶端可以輪詢該URL以獲取狀態和結果。

該URL應該包含每個請求的唯一ID。您的服務器可以跟蹤它並在準備就緒時填充響應。

+0

其實HTTP並沒有涉及這項服務。客戶端,網關和服務器端都是Java應用程序。 – celik 2013-03-05 18:18:02

+0

客戶端如何與服務器通信? – 2013-03-05 18:44:05

+0

客戶端和網關之間以及網關和服務器之間有套接字連接。 – celik 2013-03-05 18:52:26