一种异步保存的思路
程序员文章站
2022-06-09 22:00:40
...
当用户进行了post操作之后,后台可能会做很多的操作。
比如说,创单人录入一条工单,点击“提交”之后。后台需要将工单数据写入数据库,然后要计算工单关联关系,计算任务优先级,进行工单智能分析,进行预调度等等操作
这些操作涉及到大量的IO,以及逻辑判断,因此要耗费比较长的时间。
但是对于创单人来说,他关注的首先是这条工单创建是否成功,也就是是否能够尽快得到创建成功的反馈页面。
那么这个时候,就可以采用类似于如下伪代码的方式:
这样的话,用户就可以第一时间得到基本操作的响应结果,同时另一个线程,完成其他的耗时操作,这些操作的结果,不是用户首要关注的
不过,这个方案有一个问题,在返回响应之后,一次http请求/响应就结束了。如果后续其他耗时操作完成之后,怎么把操作结果主动反馈给用户呢?
我想到一种方式,可以采取comet等服务端主动推送的方式,在其他操作完成之后,主动再把操作结果反馈给用户。
另一种方式,可以在返回响应时,给回一个javascript脚本,设定为延迟若干秒,再通过AJAX方式,用浏览器再重新发起请求,到服务端获取想要的操作结果
比如说,创单人录入一条工单,点击“提交”之后。后台需要将工单数据写入数据库,然后要计算工单关联关系,计算任务优先级,进行工单智能分析,进行预调度等等操作
这些操作涉及到大量的IO,以及逻辑判断,因此要耗费比较长的时间。
但是对于创单人来说,他关注的首先是这条工单创建是否成功,也就是是否能够尽快得到创建成功的反馈页面。
那么这个时候,就可以采用类似于如下伪代码的方式:
public void doPost(HttpServletRequest req, HttpServletResponse resp){
req.getInputStream();
// 从输入流中取出用户录入的工单数据
// 将工单数据写入数据库
new MyThread().start();// 这行是重点,新起线程,完成其他操作
resp.getWriter();
// 写成功响应并发送
}
这样的话,用户就可以第一时间得到基本操作的响应结果,同时另一个线程,完成其他的耗时操作,这些操作的结果,不是用户首要关注的
不过,这个方案有一个问题,在返回响应之后,一次http请求/响应就结束了。如果后续其他耗时操作完成之后,怎么把操作结果主动反馈给用户呢?
我想到一种方式,可以采取comet等服务端主动推送的方式,在其他操作完成之后,主动再把操作结果反馈给用户。
另一种方式,可以在返回响应时,给回一个javascript脚本,设定为延迟若干秒,再通过AJAX方式,用浏览器再重新发起请求,到服务端获取想要的操作结果
下一篇: 安卓换肤的一种实现思路