看如下代码。场景为:前端发起一个 ajax 请求至后端,后端接收请求,通过远程调用其他系统获取数据,然后将数据响应给前端。在这个过程中,我希望后端能将获取的数据存入本地库(saveData)。那么如果我这个saveData方法写在“后端响应给前端(render)之后,”,saveData一定会执行吗?哪怕执行耗时很长?假如前端用户已经在点击其他请求了呢?
谢谢!!
public void ajaxTest(...) {
Object data = getData(); // 此处为以某种方式(如远程)获取数据
saveData(data); // 此处将获得的数据入库
renderJSON(response, data); // 将数据响应给前段 ajax 请求
saveData(data); // 这句一定会执行吗?如果会,那么假设该句耗时较久,写在 renderJSON之后,相比写在renderJSON之前而言,更有利于前端响应速度?
}
/**
* 将JSON对象写入http响应流
*
* @param response http响应
* @param obj JSON对象
*/
public static void renderJSON(HttpServletResponse response, Object obj) {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = null;
try {
out = response.getWriter();
out.print(JSONMapper.toJSON(obj).render(false));
} catch (MapperException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != out) {
out.close();
}
}
}
------解决思路----------------------
saveData(data); // 这句一定会执行
如果不依赖存储结果,这个操作又很耗时,放后面是明智的选择。
------解决思路----------------------
renderJSON捕获了CheckedException类异常,出现此种异常及不抛出异常时都执行savedata。
但是没有捕获RuntimeException类异常,此时将跳出,不执行savedata操作。