如何避免请求设置ASYNC_SUPPORTED = true以在Tomcat 7上启用异步servlet 3.0处理?

时间:2011-10-21 21:54:04

标签: java asynchronous request tomcat7 servlet-3.0

根据此question报告的问题,找到了解决方案:

req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);

这看起来有点奇怪,并不是真正的“便携式”代码(它不会受到伤害,但......)。它似乎特定于Tomcat 7.我使用的是NetBeans 7.0.1提供的Tomcat 7.0.14。

我找不到文档,表明有必要在servlet 3.0中使用catalina属性启用异步请求处理。我找不到在Tomcat配置级别上需要特殊内容的文档。

有没有办法避免在每个请求中设置ASYNC_SUPPORTED=true以在Tomcat 7中启用异步servlet 3.0处理?

3 个答案:

答案 0 :(得分:7)

首先要检查几件事:

确保对请求进行操作的所有过滤器也支持异步(如one of the answers中针对您引用的问题所述)。

确保您使用的是Servlet 3.0 web.xml - 例如:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0"
         metadata-complete="true">

答案 1 :(得分:4)

尝试升级。

  • Bug 53623已在7.0.30中修复。
  • “为Servlet 3异步处理支持启用剩余阀门。” (在7.0.16中修复)

查看Tomcat 7 ChangeLog以获取完整的详细信息。

另外,如果你想使用async,那么你需要确保链中的所有过滤器和阀门(当然还有servlet)都支持异步。这可能是原始问题以及您的案例中的问题。

答案 2 :(得分:1)

我发现只有当你从一个普通的servlet / jsp(内部)转发到async-servlet时才需要org.apache.catalina.ASYNC_SUPPORTED=true! 示例:在我的index.jsp中,我嵌入了<jsp:forward page="/path/AsyncServlet" /> 我保证当我从浏览器直接触发它时,AsyncServlet在Tomcat7和Glassfish3上都能正常工作! 但是当我通过index.jsp触发它时: Tomcat7报告500“不支持” Glassfish3报告500“请求在不支持异步操作的过滤器或servlet的范围内” 如果我在<% request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); %>之前将<jsp:forward>嵌入到index.jsp中,那么Tomcat7就可以了,但是Glassfish3仍然很糟糕! 所以我找到了Tomcat7和Glassfish3的解决方案(没有SYNC_SUPPORTED!): 只需在web.xml中正确附加以下内容:

<servlet>
    <servlet-name>indexPage</servlet-name>
    <jsp-file>/index.jsp</jsp-file>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>indexPage</servlet-name>
    <url-pattern>/index.jsp</url-pattern>
  </servlet-mapping>

结论(对我来说): 你不能从普通的servlet / jsp / filter转发到async-one!由于异步请求功能必须预设! 因此,需要转发到async-servlet的servlet / jsp / filter的常见解决方案是: 使用<servlet>/<async-supported>true@WebServlet(asyncSupported = true)作为预处理的servlet; 将<servlet>/<async-supported>true用于预处理的jsp 使用<filter>/<async-supported>true@WebFilter(asyncSupported = true)作为预处理过滤器; 希望这可能会有所帮助!