【问题标题】:Async Servlet Exception异步 Servlet 异常
【发布时间】: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


【解决方案1】:

如果你使用 tomcat 作为你的 web 服务器,那么你应该保持你将使用 asyc 请求到 tomcat

在开始异步请求之前输入这行代码

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

我希望你能从中得到你想要的

【讨论】:

    【解决方案2】:

    如果应用程序尝试启动异步操作并且请求处理链中存在不支持异步处理的 servlet 或 servlet 过滤器,则会引发 IllegalStateException。因此可能存在一些错误。请检查您的代码。

    【讨论】:

    • 是的,我很确定。它适用于玻璃鱼。我认为这是 apache tomcat 7.0.14 中的一个错误。它也适用于以后的 tomcat 版本。
    猜你喜欢
    • 1970-01-01
    • 2012-09-07
    • 2013-05-12
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2011-11-19
    • 2015-08-13
    相关资源
    最近更新 更多