2
我的客戶希望我的servlet能夠返回X秒內的結果,如果有什麼回報,與這樣的消息否則返回ZT X秒「對不起,無法在規定時間內返回」如何在X秒內爲servlet請求提供返回語義?
這是一個真正的synchronos調用一個超時的servlet。這種行爲有沒有確定的模式?
這樣做的理想方式是什麼?
我的客戶希望我的servlet能夠返回X秒內的結果,如果有什麼回報,與這樣的消息否則返回ZT X秒「對不起,無法在規定時間內返回」如何在X秒內爲servlet請求提供返回語義?
這是一個真正的synchronos調用一個超時的servlet。這種行爲有沒有確定的模式?
這樣做的理想方式是什麼?
請求處理程序線程創建一個名爲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是另一個需要考慮的選項,但會增加另一層複雜性。
除了確保嘗試並停止超過超時的線程外,還應該考慮爲工作人員使用線程池。您需要確保您可以控制在您的Web應用程序中創建的線程數的上限。如果你沒有清理線程,也不使用線程池,那麼你可能會遇到一大堆線程,所有線程都會相互爭奪並放慢整個混亂。 – rfeak 2011-02-01 06:09:31