0

我有一个 servlet 需要几分钟来处理并返回它的响应。它在受限制的环境(Amazon Elastic Beanstalk)中运行。在此环境中,请求时间有 60 秒的限制,并且不可配置。

我在这里有什么选择?我曾想过让 servlet 启动一个线程并让浏览器使用 AJAX 轮询,但我看到很多人出于各种原因建议不要使用 servlet 启动线程。

另一种解决方案是在应用程序的上下文侦听器中启动和结束线程,但我在应用程序中有许多不同的 servlet,它们执行各种功能,所有这些都有相同的问题。在后台运行的单个线程并没有真正的帮助。

有什么建议么?

编辑:通过对 SO 的更多研究,我发现Executor 是我所需要的。

在此处查看 BalusC 的答案

在此处查看 skaffman 的答案

4

2 回答 2

1

是的,以编程方式将线程启动到 serverlet 容器中并不是最佳实践。但这个限制并没有那么严格。恕我直言,如果你真的需要,你可以做到。但是,如果您要开始这样的解决方案,请逐步实施。

首先尝试是否可行。打开新线程来处理您的长请求。在处理它时,从您的 servlet 的“主”线程发送某种“保持活动”。处理完成后向客户端发送响应。

可能更好和更具可扩展性的解决方案是使用消息传递(例如 JMS)来异步处理长请求。当收到请求时,servlet 应该只创建 JMS 消息,将其排入队列并立即返回。另一方(实现 MessageListener)应该处理消息并将结果放入传出队列。客户端应该从这个队列请求结果。这是明确的解决方案,它将在集群和多机环境中工作,但需要更多的努力。

因此,您的选择应取决于您的要求、资源和时间。

于 2012-02-01T08:37:38.760 回答
1

解决此问题的最佳方法是使用 Executor(请参阅我的问题中的更新)。我在我的项目中使用了它,它可以无缝运行。

于 2012-03-22T22:56:02.373 回答