2011-02-01 66 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