controller提前响应前台---后期慢慢运行其他逻辑

戚薇 SpringMVC 发布时间:2023-04-06 22:53:58 阅读数:8654 1
今天遇到这样一个问题
controller中有一个非常复杂
    且非常耗时的业务,
	这样就会导致方法运行超时
那么有没有一种方法,使Controller提前响应客户端
同时后台的业务逻辑,让她慢慢的自己去跑
实现方法:
    1.借助response方法向客户端写入响应的信息,然后关闭写入流,提前返回
	    或
	2.采用线程的方式运行业务逻辑方法,也可以实现提前返回
例:
使用response返回响应
@PostMapping("/test1")
public Object testController(HttpServletRequest request, HttpServletResponse response) throws Exception {
	JSONObject resp = new JSONObject();
	resp.put("uri", request.getRequestURI());
	resp.put("url", request.getRequestURL());

	//设置响应报文为json格式
	response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);

	PrintWriter out = response.getWriter();
	out.print(resp.toString());//设置响应报文
	out.close();//强制返回
	System.out.println("http响应已返回 " + System.currentTimeMillis());

	System.out.println("响应返回后,可以继续执行其他逻辑..." + System.currentTimeMillis());
	Thread.sleep(3000);//模拟耗时
	System.out.println("执行完毕 " + System.currentTimeMillis());

	return null;
}
使用线程运行耗时逻辑
 
@PostMapping("/test2")
public Object testController2(HttpServletRequest request, HttpServletResponse response) throws Exception {
	JSONObject resp = new JSONObject();
	resp.put("uri", request.getRequestURI());
	resp.put("url", request.getRequestURL());

	System.out.println("创建新线程去执行其他逻辑,不会阻塞当前请求");
	new Thread(new Runnable() {
		@Override
		public void run() {
			System.out.println("新线程内逻辑执行..." + System.currentTimeMillis());
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("执行完毕 " + System.currentTimeMillis());
		}
	}).start();

	System.out.println("http响应返回 " + System.currentTimeMillis());
	return resp;
}
 
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringMVC/202304/6192.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者