用属性asyncSupported=true开启Servlet对异步的支持。
在请求时,在request.startAsync()抛java.lang.IllegalStateException: Not supported.的异常。
原因是同一个Web应用中其他地方定义了Filter,且没有指定asyncSupported=true ,导致该异常。必须为此应用中所有Filter指定asyncSupported=true。
------2014年06月08日重新运行情况:
1 六月 08, 2014 12:20:54 上午 org.apache.catalina.core.StandardWrapperValve invoke 2 严重: Servlet.service() for servlet [com.hackem.testweb.asyncservlet.AsyncServlet] in context with path [/testweb] threw exception 3 java.lang.IllegalStateException: Not supported. 4 at org.apache.catalina.connector.Request.startAsync(Request.java:1658) 5 at org.apache.catalina.connector.Request.startAsync(Request.java:1651) 6 at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1022) 7 at com.hackem.testweb.asyncservlet.AsyncServlet.doGet(AsyncServlet.java:47) 8 at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 9 at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 10 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 11 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 12 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 13 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 14 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 15 at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) 16 at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 17 at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 18 at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389) 19 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 20 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 21 at com.hackem.testweb.filter.LogFilter.doFilter(LogFilter.java:57) 22 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 23 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 24 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 25 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 26 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 27 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 28 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 29 at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 30 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 31 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 32 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) 33 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 34 at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2442) 35 at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2431) 36 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 37 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 38 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 39 at java.lang.Thread.run(Thread.java:745)
查看源码注释发现:
* @throws IllegalStateException if this request is within the scope of
* a filter or servlet that does not support asynchronous operations
* (that is, {@link #isAsyncSupported} returns false),
* or if this method is called again without any asynchronous dispatch
* (resulting from one of the {@link AsyncContext#dispatch} methods),
* is called outside the scope of any such dispatch, or is called again
* within the scope of the same dispatch, or if the response has
* already been closed
写得很清楚,如果此Servlet请求经过不支持异步的Filter处理,就会抛出异常,问题初步解决。