我有一个servlet需要几分钟的时间来处理并返回它的响应。它在一个受限制的环境中运行(Amazon Elastic Beanstalk)。在此环境中,请求时间限制为60秒,并且不可配置。
我有什么选择?我想过让servlet启动一个线程并使用AJAX进行浏览器轮询,但是我看到很多人建议不要因为各种原因而对servlet启动线程。
另一个解决方案是在应用程序的上下文侦听器中启动和结束一个线程,但我在应用程序中有许多不同的servlet执行各种功能,所有这些功能都有相同的问题。在后台运行的单个线程实际上没有帮助。
有什么建议吗?
编辑:通过对SO的一些研究,我发现Executor 是我需要的。
答案 0 :(得分:1)
是的,将programmaticaly线程启动到servelet容器中并不是最好的做法。但这种限制并不是那么严格。恕我直言,如果你真的需要,你可以做到。但是,如果您正在开始这样的解决方案,请逐步实施。
首先尝试这是否有效。打开新线程来处理您的长请求。正在处理它时,从servlet的“主”线程发送某种“保持活动”。处理完成后,向客户端发送响应。
可能更好且更具可扩展性的解决方案是使用消息传递(例如JMS)来进行长请求的异步处理。收到请求时,servlet应该只创建JMS消息,将其排队并立即返回。另一方(实现MessageListener)应该处理消息并将结果放入传出队列。客户端应该从此队列请求结果。这是明确的解决方案,它将在集群和多机器环境中工作,但它需要更多的努力。
因此,您的选择应取决于您的要求,资源和时间。
答案 1 :(得分:0)
解决此问题的最佳方法是使用Executor(请参阅我的问题中的更新)。我在我的项目中使用了它,并且它无缝地工作。