2011-10-13 114 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中定義過濾器); <異步支持>真