2010-03-19 76 views
0

1)我的環境是web應用程序,我開發servlet來接收請求。邏輯控制併發塊/方法

A)在一些塊/方法我想控制併發往不大於5
B)是否存在在該塊5請求時,新產品必須等待最多60秒鐘,則拋出錯誤
C)如果有睡眠/等待請求超過30,第31個請求將被拋出錯誤

我該怎麼做?

2)(可選問題)從上面我必須分配控制邏輯到所有集羣主機。 我打算使用hazelcast共享控制邏輯(例如,當前計數器)

我看到他們提供的BlockingQueue & ExectorService,但我不知道如何在我的情況下使用。 如果你有想法,請推薦。

+0

我已經閱讀了3次以上的問題,並想了解一下這個過程是否合理。我沒看見。您的意圖是真的限制servlet上的最大併發請求數量嗎?你需要什麼?什麼是功能要求?您認爲這是解決方案的問題是什麼? – BalusC

+0

我做了一個供應過程,而不是一個網頁servlets。當請求來自客戶端時,我有新的線程啓動並執行活動。 一些活動限制併發。我的觀點 – Hlex

回答

0

嘗試semaphors

一個計數信號量。從概念上講, 信號量擁有一套許可證。 如果需要,每個獲取()會阻止 ,直到獲得許可證,然後 接受它。每個版本()都會添加一個 許可證,可能會釋放阻止收單方的 。但是,不使用實際的許可證對象;信號量 只保留可用數量 的計數,並據此採取行動。

1

@Roman和@David Soroko的回答說如何在一個servlet中完成這項工作(如OP問)。

但是,這種方法存在的問題是tomcat必須爲每個請求分配一個線程,以便它們可以參與由servlet實現的排隊/超時邏輯。每個線程都使用內存和其他資源。 這並不好。如果你沒有配置足夠的線程,請求將被tomcat請求分派器丟棄,或者使用不同的邏輯排隊/超時。

另一種方法是在web服務器中使用非servlet體系結構;例如Grizzly,更具體地說是Grizzly Comet。這是一個很大的話題,坦率地說,我不太瞭解它深入實施的細節。

編輯 - 在servlet模型中,每個請求在整個生命週期內都被分配給一個線程。例如,在典型的「服務器推送」模式中,每個活動客戶端都有一個未完成的HTTP請求,要求服務器提供更多數據。當新數據到達服務器時,服務器發送響應,客戶端立即發送新的請求。在傳統的servlet實現模型中,這意味着即使大多數線程只是在等待數據到達,服務器也必須爲每個活動客戶端提供一個「進行中」的請求...和一個線程...。

在可伸縮體系結構中,您將從線程分離請求,以便該線程可用於處理其他請求。之後(例如,當數據「到達」「服務器推送」示例中)時,請求將被附加到線程(可能是不同的線程)以繼續處理。在Grizzly中,我明白這是使用基於事件的處理模型完成的,但我想你也可以使用基於協程的模型。

+0

@大衛 - 我從來沒有說過你。另外,那不是我的觀點。 –

+0

我的誤解。 我認爲唯一的假設是每個請求都是從一個線程提供的。我不明白這是如何消除的。 –