controller提前响应前台---后期慢慢运行其他逻辑
今天遇到这样一个问题
使用response返回响应
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;
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


