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; }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。