Servlet 3.0 异步支持不起作用

Posted

技术标签:

【中文标题】Servlet 3.0 异步支持不起作用【英文标题】:Servlet 3.0 Async-supported does not work 【发布时间】:2011-05-05 12:43:54 【问题描述】:

这是我的 web.xml

    <filter>
    <filter-name>pollingTest</filter-name>
    <filter-class>
        webapp.controller.core.servlet.PollingService
            </filter-class>
    <async-supported>true</async-supported>
</filter>
<filter-mapping>
    <filter-name>pollingTest</filter-name>
    <url-pattern>/app/poll</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>ASYNC</dispatcher>
</filter-mapping>

这是课程:

public class PollingService implements Filter 
Logger logger = LoggerFactory.getLogger(getClass());

@Override
public void destroy() 
    logger.info("Destroy");


@Override
public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException 

    logger.info("Running");
    req.startAsync(req, res);
    this.doFilter(req, res, chain);
    return;


@Override
public void init(FilterConfig arg0) throws ServletException 

    logger.info("Init=");

我在 glassfish 和 tomcat 7 上运行它,出现异常:

java.lang.IllegalStateException: Request is within the scope of a filter or servlet that does not support asynchronous operations
at org.apache.catalina.connector.Request.startAsync(Request.java:3657)
at org.apache.catalina.connector.Request.startAsync(Request.java:3633)
at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1053)
at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:450)

谁能帮我解决这个问题?非常感谢。

【问题讨论】:

显示整个 web.xml(至少 &lt;web-app&gt; 标签定义与命名空间) 【参考方案1】:

因为您的 servlet 和链中的任何其他过滤器必须在 web.xml 中有 &lt;async-supported&gt;true&lt;/async-supported&gt;

【讨论】:

如何用注解做到这一点? @WebFilter(urlPatterns = "/*", asyncSupported = true) Netbeans 8.2 / Tomcat 8.0.27:我还必须禁用 HTTP 监视器(服务 -> 服务器 -> 右键单击​​ Apache Tomcat -> 属性 -> 取消选中启用 HTTP 监视器)。看起来是bug。【参考方案2】:

您正在递归调用this.doFilter(req, res, chain);

如果你想继续这个链,你必须调用chain.doFilter(httpRequest, httpResponse);而不是this.doFilter(req, res, chain);

【讨论】:

【参考方案3】:

我遇到了类似的问题,但就我而言,这还不够。如果使用标签 Context 和 Valve(在 tomcat7 - service.xml 中),则必须在标签值中添加参数 asyncSupported="true"。然后就成功了。

<Context docBase="aaa" path="/aaa" reloadable="true" source="org.eclipse.jst.jee.server:aaa"><Valve className="cz.tomcatUtil.ForceUserValve" user="DZC0GRP" asyncSupported="true"/></Context>

【讨论】:

【参考方案4】:

我知道这是一篇旧帖子,但我想分享我的解决方案。我花了 1 周的时间才找到原因,因为我几乎尝试了所有可能的解决方案。

对我来说,servlet url-pattern 不正确。

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/pattern/</url-pattern> <---
  </servlet-mapping>

希望对你有用。

【讨论】:

【参考方案5】:

彼得·卡拉比诺维奇,你的回答不是真的。来自 Servlet 3.0 规范:

2.3.3.3 异步处理 ... 从具有 asyncSupported=true 的 servlet 分派到一个 asyncSupported 设置为 false 是允许。在这种情况下,响应将是 当不支持异步的 servlet 的服务方法被提交时 退出...

【讨论】:

根据 Servlet 4.0 规范:“..如果请求在不支持异步操作的 servlet 或过滤器范围内,则调用 startAsync 是非法的......”【参考方案6】:

您可以像这样使用 Annotation 来映射异步 Servlet

@WebServlet(urlPatterns = "/yourServlet", **asyncSupported=true**)

public class YourServlet extends HttpServlet  

【讨论】:

以上是关于Servlet 3.0 异步支持不起作用的主要内容,如果未能解决你的问题,请参考以下文章

dottrace 异步等待支持不起作用

Actionscript 3.0 调用 Javascript 不起作用?

MagicalRecord release/3.0 - 日志记录不起作用

AFNetworking 3.0 后台上传不起作用

swift 3.0 - UITextFieldDelegate 协议扩展不起作用

Google Analytics(分析)屏幕跟踪 swift 3.0 不起作用