2011-02-01 28 views
2

我的客戶希望我的servlet能夠返回X秒內的結果,如果有什麼回報,與這樣的消息否則返回ZT X秒「對不起,無法在規定時間內返回」如何在X秒內爲servlet請求提供返回語義?

這是一個真正的synchronos調用一個超時的servlet。這種行爲有沒有確定的模式?

這樣做的理想方式是什麼?

回答

3

請求處理程序線程創建一個名爲myQueue的BlockingQueue並將其提供給工作線程,該工作線程在完成時將其結果放入隊列中。然後,處理程序線程調用「myQueue.poll(X, TimeUnit.SECONDS)」,如果它得到一個返回序列化結果,或者如果它返回null(即「poll」調用超時),則返回「超時」錯誤。這裏是它會如何看一個例子:

// Servlet handler method. 
BlockingQueue<MyResponse> queue = new ArrayBlockingQueue<MyResponse>(); 
Thread worker = new Thread(new MyResponseGenerator(queue)); 
worker.start(); 
MyResponse response = queue.poll(10, TimeUnit.SECONDS); 
if (response == null) { 
    worker.interrupt(); 
    // Send "timeout" message. 
} else { 
    // Send serialized response. 
} 

注普遍認爲線程管理(尤其是在一個servlet容器)是充滿陷阱的,所以你應該非常熟悉的servlet規範和行爲的特定的servlet容器,然後在生產系統中使用此模式。

使用ThreadPool是另一個需要考慮的選項,但會增加另一層複雜性。

+0

除了確保嘗試並停止超過超時的線程外,還應該考慮爲工作人員使用線程池。您需要確保您可以控制在您的Web應用程序中創建的線程數的上限。如果你沒有清理線程,也不使用線程池,那麼你可能會遇到一大堆線程,所有線程都會相互爭奪並放慢整個混亂。 – rfeak 2011-02-01 06:09:31

相關問題