Servlet3.0提供的异步处理

用属性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处理,就会抛出异常,问题初步解决。

作者:hackem
         
本文版权归原作者所有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/hackem/p/3190175.html