2012-06-10 48 views
4

我是JavaEE 6的新手,并且我了解到它支持名为AsyncServlets的异步servlet。 所以我试着用JavaEE6创建一个小程序。异步Servlet异常

这是我为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代码:不支持。我使用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) 
+0

我在你的代码中看不到任何问题(除了为每个请求创建一个线程池并且从不关闭它!) - 你可以发布引发异常的完整堆栈跟踪吗? –

+1

你确定'asyncSupported'属性被设置为'true'吗?尝试重新启动/重新编译以确保它被反映出来。你的servlet适用于我,但是当使用asyncSupported = false时,我得到了同样的错误。 –

+0

@ Tomasz是的..即使我创建了一个新的应用程序,问题仍然存在。无论如何它在glassfish 3.1.2.1中工作似乎有点不对劲服务器 – Krishan

回答

4
如果应用程序试图启动异步操作并有在servlet或Servlet过滤器

一个IllegalStateException将被抛出请求处理链不支持异步处理。所以可能会有一些错误.plz检查你的代码。

+0

是的,我非常确定这一点。它适用于玻璃鱼。我认为这是apache tomcat 7.0.14中的一个bug。它也适用于后来的tomcat版本。 – Krishan

8

,如果你使用Tomcat作为Web服务器,那么你应该maintion,你要使用ASYC请求到Tomcat

前开始异步请求,就把这行代码

request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); 

我希望你能得到你想从它里面得到什么

+0

谢谢,这为我解决了。 –

+0

非常感谢。 –