【问题标题】:How to avoid request set ASYNC_SUPPORTED=true to enable async servlet 3.0 processing on Tomcat 7?如何避免请求设置 ASYNC_SUPPORTED=true 在 Tomcat 7 上启用异步 servlet 3.0 处理?
【发布时间】:2011-12-12 22:22:19
【问题描述】:

在此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 处理?

【问题讨论】:

  • 在 Tomcat 7.0.27 req.startAsync()req.startAsync(req, res) 中工作,没有错误和其他设置。

标签: java asynchronous request tomcat7 servlet-3.0


【解决方案1】:

首先要检查几件事:

确保对请求进行操作的任何过滤器也支持异步(如您所引用的问题的 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">

【讨论】:

    【解决方案2】:

    尝试升级。

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

    查看Tomcat 7 ChangeLog 了解完整详情。

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

    【讨论】:

    • 我使用的是 Tomcat 7.0.34,web.xml 中的 servlet 版本确实是 3.0,一切都应该启用异步(因为它与 Jetty 一起工作)
    • @Eugen Jetty 对规范的解释可能略有不同。 “它在 Jetty 中工作”并不是 Tomcat 存在错误的坚如磐石的论点。
    • +1 参考最近的错误修复。最近 5 个版本 (7.0.30-35) 中有许多有用的异步错误修复
    【解决方案3】:

    我发现org.apache.catalina.ASYNC_SUPPORTED=true 仅在您从一个 normal-servlet/jsp(内部)转发到一个 async-servlet 时才需要! 示例:在我的 index.jsp 中,我嵌入了 &lt;jsp:forward page="/path/AsyncServlet" /&gt; 我保证当我直接从浏览器触发 AsyncServlet 时,它在 Tomcat7 和 Glassfish3 上都能正常工作! 但是,当我通过 index.jsp 触发它时: Tomcat7 报告“不支持”500 Glassfish3 报告 500 “请求在不支持异步操作的过滤器或 servlet 范围内” 如果我在 index.jsp 中的 &lt;jsp:forward&gt; 之前嵌入 &lt;% request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); %&gt;,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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 2012-01-15
      • 2017-12-08
      • 2019-02-28
      • 2017-06-24
      • 2011-12-19
      • 2022-01-05
      相关资源
      最近更新 更多