13

我创建了一个 servlet 3.0 来探索异步请求处理:

@WebServlet(name="MyTest", urlPatterns={"/MyTest"}, asyncSupported=true)
public class MyTest extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {

        AsyncContext tmp = req.startAsync(req, res);
        ...

    }    

}

但我得到了一个IllegalStateException何时.startAsync(...)被调用。我知道 Javadoc 提到了该异常,但我确实明确启用了异步(cfWebServlet注释)。我正在使用随 NetBeans 提供的 Tomcat 7.0.11.0。

我可以确认req.isAsyncSupported()返回错误。我究竟做错了什么?我还需要做什么才能启用异步处理?

编辑:

我尝试实现以下示例并遇到相同的问题。

4

2 回答 2

29

我检查了 Tomcat 的代码,发现 asyncSupported 变量必须显式设置为 true。这就是为什么你得到req.isAsyncSupported() == false.

您可以尝试通过以下方法之一将 HttpServletRequest 对象中的 async 属性设置为 true。

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

或者

((org.apache.catalina.connector.Request)req).setAsyncSupported(true);

希望能帮助到你。

于 2011-10-21T13:45:00.510 回答
8

请检查您是否有任何未启用支持异步的请求过滤器。您可以(暂时)删除过滤器或将其标记为支持异步。

于 2012-10-28T06:09:39.550 回答