锁定老帖子 主题:一种异步保存的思路
精华帖 (0) :: 良好帖 (1) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-07-31
比如说,创单人录入一条工单,点击“提交”之后。后台需要将工单数据写入数据库,然后要计算工单关联关系,计算任务优先级,进行工单智能分析,进行预调度等等操作 这些操作涉及到大量的IO,以及逻辑判断,因此要耗费比较长的时间。 但是对于创单人来说,他关注的首先是这条工单创建是否成功,也就是是否能够尽快得到创建成功的反馈页面。 那么这个时候,就可以采用类似于如下伪代码的方式: public void doPost(HttpServletRequest req, HttpServletResponse resp){ req.getInputStream(); // 从输入流中取出用户录入的工单数据 // 将工单数据写入数据库 new MyThread().start();// 这行是重点,新起线程,完成其他操作 resp.getWriter(); // 写成功响应并发送 } 这样的话,用户就可以第一时间得到基本操作的响应结果,同时另一个线程,完成其他的耗时操作,这些操作的结果,不是用户首要关注的 不过,这个方案有一个问题,在返回响应之后,一次http请求/响应就结束了。如果后续其他耗时操作完成之后,怎么把操作结果主动反馈给用户呢? 我想到一种方式,可以采取comet等服务端主动推送的方式,在其他操作完成之后,主动再把操作结果反馈给用户。 另一种方式,可以在返回响应时,给回一个javascript脚本,设定为延迟若干秒,再通过AJAX方式,用浏览器再重新发起请求,到服务端获取想要的操作结果 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-08-01
第一次响应服务器返回一个key,服务器端使用队列处理,客户端可以过一段时间在使用之前的key看是否处理完毕
当然comet是比较好的方法 |
|
返回顶楼 | |
发表时间:2012-08-01
最后修改:2012-08-01
单独建立一张未处理表(只存工单编号),创建一个任务处理线程执行后续任务(可以池化):
1.1、当创建好工单 主动 推给任务处理线程 任务进行处理,处理完成后在未处理表中删除; 1.2、定期轮询未处理表,防止没有处理的任务; 这种方式的好处是可靠(数据已经持久化)且相对于上MQ要简单。 不知可行否 |
|
返回顶楼 | |
发表时间:2012-08-01
jinnianshilongnian 写道 单独建立一张未处理表(只存工单编号),创建一个任务处理线程执行后续任务(可以池化):
1.1、当创建好工单 主动 推给任务处理线程 任务进行处理,处理完成后在未处理表中删除; 1.2、定期轮询未处理表,防止没有处理的任务; 这种方式的好处是可靠(数据已经持久化)且相对于上MQ要简单。 不知可行否 龙年大哥什么情况?5点就醒了? |
|
返回顶楼 | |
发表时间:2012-08-01
kyfxbl 写道 jinnianshilongnian 写道 单独建立一张未处理表(只存工单编号),创建一个任务处理线程执行后续任务(可以池化):
1.1、当创建好工单 主动 推给任务处理线程 任务进行处理,处理完成后在未处理表中删除; 1.2、定期轮询未处理表,防止没有处理的任务; 这种方式的好处是可靠(数据已经持久化)且相对于上MQ要简单。 不知可行否 龙年大哥什么情况?5点就醒了? 恩 呵呵 |
|
返回顶楼 | |
发表时间:2012-08-01
用异步线程搞.如果创建的单子很多.那线程肯定不够用.即使线程池,在线程达到上限的时候也会让整个应用响应速度变慢.而且如果异步线程处理失败.那如何重新开搞呢?
个人觉得jinnianshilongnian的方法不错.由后台其他程序来调度这个异步任务表.也能保证失败自动修复 |
|
返回顶楼 | |
发表时间:2012-08-01
恩,龙年大哥的办法很不错
|
|
返回顶楼 | |
发表时间:2012-08-01
kyfxbl 写道 恩,龙年大哥的办法很不错
估计你比我大,我87的 得喊你大哥 |
|
返回顶楼 | |
发表时间:2012-08-01
lz 能否解决 http长连接只能建立2个的问题?
|
|
返回顶楼 | |
发表时间:2012-08-01
jinnianshilongnian 写道 kyfxbl 写道 恩,龙年大哥的办法很不错
估计你比我大,我87的 得喊你大哥 嘿嘿,你技术比我好,你就是大哥,不要客气 |
|
返回顶楼 | |