我创建了一个servlet 3.0来探索异步请求处理:
@WebServlet(name="MyTest", urlPatterns={"/MyTest"}, asyncSupported=true)
public class MyTest extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
AsyncContext tmp = req.startAsync(req, res);
...
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到的IllegalStateException
时候.startAsync(...)
被调用.我知道Javadoc提到了异常,但我明确地启用了异步(cf WebServlet
annotation).我正在使用随NetBeans提供的Tomcat 7.0.11.0.
我可以确认这req.isAsyncSupported()
是假的.我究竟做错了什么?我还需要做些什么来启用异步处理?
编辑:
我试图实现以下示例并得到相同的问题.
我是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");
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行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 …
Run Code Online (Sandbox Code Playgroud)