【发布时间】:2012-06-10 17:40:14
【问题描述】:
我是 JavaEE 6 的新手,我了解到它支持称为 AsyncServlets 的异步 servlet。 所以我尝试使用JavaEE6创建一个小程序。
这是我的 servlet 代码
@WebServlet(name = "AsyncServlet", urlPatterns = {"/AsyncServlet"}, asyncSupported=true)
public class AsyncServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
AsyncContext aCtx = request.startAsync(request, response);
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new MyClass(aCtx));
System.out.println("Original thread is freed");
}
}
但是当我尝试运行 servlet 时,我得到一个异常 java.lang.IllegalStateException: Not supported。我使用 tomcat 7.0.14 作为服务器。我没有创建 web.xml。这段代码哪里出了问题?
编辑:
这是异常的完整堆栈跟踪
SEVERE: Servlet.service() for servlet [AsyncServlet] in context with path [/AsyncTest] threw exception
java.lang.IllegalStateException: Not supported.
at org.apache.catalina.connector.Request.startAsync(Request.java:1618)
at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1031)
at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:379)
at com.icbt.demo.servlet.AsyncServlet.doGet(AsyncServlet.java:30)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
【问题讨论】:
-
我在你的代码中没有看到任何问题(除了为每个请求创建一个线程池并且从不关闭它!) - 你能发布抛出异常的完整堆栈跟踪吗?跨度>
-
您确定
asyncSupported属性设置为true?尝试重新启动/重新编译以确保它得到反映。您的 servlet 对我有用,但是在使用asyncSupported=false时出现同样的错误。 -
@Tomasz 是啊.. 即使我创建了一个新应用程序,问题仍然存在。服务器好像有问题
-
无论如何它都可以在 glassfish 3.1.2.1 中使用。我认为问题在于tomcat
-
已解决:我推荐你看这篇文章:stackoverflow.com/questions/7855712/…
标签: java java-ee-6 tomcat7 servlet-3.0