Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Servlet连接超时_Java_Tomcat_Servlets_Amazon Elastic Beanstalk - Fatal编程技术网

Java Servlet连接超时

Java Servlet连接超时,java,tomcat,servlets,amazon-elastic-beanstalk,Java,Tomcat,Servlets,Amazon Elastic Beanstalk,我有一个servlet,它需要几分钟来处理和返回响应。它运行在一个受限的环境中(Amazon Elastic Beanstalk)。在这种环境中,请求时间有60秒的限制,这是不可配置的 我的选择是什么?我曾想过让servlet启动一个线程,并让浏览器使用AJAX进行轮询,但我看到很多人出于各种原因反对servlet启动线程 另一个解决方案是在应用程序的上下文侦听器中有一个线程开始和结束,但我在应用程序中有许多不同的servlet,它们执行不同的功能,所有这些都有相同的问题。在后台运行一个线程并没

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

我的选择是什么?我曾想过让servlet启动一个线程,并让浏览器使用AJAX进行轮询,但我看到很多人出于各种原因反对servlet启动线程

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

有什么建议吗

编辑:通过对SO的进一步研究,我发现我需要的是一个


是的,将线程编程启动到servelet容器中不是最佳做法。但这一限制并没有那么严格。如果你真的需要的话,我知道你能做什么。但是,如果您正在启动此类解决方案,请逐步实施

首先,试试看这是否有效。打开新线程以处理您的长请求。在处理过程中,从servlet的“主”线程发送某种“保持活动”。处理完成后,向客户端发送响应

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


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

解决这个问题的最佳方法是使用Executor(请参阅我问题中的更新)。我在我的项目中使用了它,它无缝地工作

+1表示完全响应和JMS。但是,我想要的答案是类似于遗嘱执行人的东西(参见对我问题的编辑)。谢谢。@stepanian,遗嘱执行人不是魔法。它使用线程池,这意味着您可以间接创建不由servlet容器管理的线程。