2011-10-13 117 views
13

我已经创建了一个servlet 3.0探索异步请求处理(REQ,RES):IllegalStateException异常:不支持AsyncContext.startAsync

@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提到这个例外,但我明确地启用了异步(c.f. WebServlet注释)。我正在使用随NetBeans提供的Tomcat 7.0.11.0。

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

编辑:

我试图实现以下example,得到了相同的问题。

+0

我现在重新安装了NetBeans 7.0.1,它随Tomcat 7.0.14一起提供,但我仍然遇到同样的问题。 – JVerstry

回答

27

我检查了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); 

希望它能帮助。

+0

哦,很好。我要试试这个...很多很多谢谢! – JVerstry

+1

请求的类型不是org.apache.catalina.connector.Request,而是将ASYNC_SUPPORTED设置为true才有效! – JVerstry

+1

太棒了!很高兴有帮助。 – Efthymis

8

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

+0

示例(如果您在web.xml中定义过滤器); <异步支持>真

相关问题