java.lang.IllegalStateException: 如果当前请求不在异步模式下,则调用此方法是非

servlet异步请求

要求servlet3.0以上环境。Tomcat8.0。依赖于servlet-api(Tomcat的包)

1.顺序出错


import java.io.IOException;

import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(value = "/asyn", asyncSupported = true)
public class ServletAsync extends HttpServlet{
    
    

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    

		AsyncContext startAsync = req.startAsync();
		startAsync.start(new Runnable() {
    
    
			@Override
			public void run() {
    
    
				try {
    
    
					sayHello();
					startAsync.complete(); // 此处说明异步的结束。但是不知道为啥不能在这里用
					AsyncContext aContext = req.getAsyncContext();
					ServletResponse response = aContext.getResponse();
					response.getWriter().write("Hello Async..."); 
				} catch (Exception e) {
    
    
					e.printStackTrace();
				}
			}
		});
	}
	
	protected void sayHello() throws Exception {
    
    
		Thread.sleep(3000);
		System.out.println("异步处理中...\nHello~");
	}
	
}

2.解决问题


import java.io.IOException;

import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//支持异步
@WebServlet(value = "/asyn", asyncSupported = true)
public class ServletAsync extends HttpServlet{
    
    

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
		AsyncContext startAsync = req.startAsync();
		startAsync.start(new Runnable() {
    
    
			@Override
			public void run() {
    
    
				try {
    
    
					sayHello();
					AsyncContext aContext = req.getAsyncContext(); // 这里可能需要在complete()前使用。
					ServletResponse response = aContext.getResponse();
					response.getWriter().write("Hello Async..."); 
					startAsync.complete(); // 此处说明异步的结束。
				} catch (Exception e) {
    
    
					e.printStackTrace();
				}
			}
		});
	}
	
	protected void sayHello() throws Exception {
    
    
		Thread.sleep(3000);
		System.out.println("异步处理中...\nHello~");
	}
	
}

庄周晓梦迷蝴蝶,望帝春心托杜鹃。——李商隐

猜你喜欢

转载自blog.csdn.net/weixin_37627774/article/details/108446671