实现3天订单自动取消

来源:互联网 发布:bulkrequest java 编辑:程序博客网 时间:2024/04/29 20:32

采用2种方式混合来处理,保证结果的完全准确性。

1、采用主动触发的方式来取消订单。
订单的表里面,再加入有效时间字段,如果查询的时候,如果订单为已下单未处理状态,查询有效字段,如果该字段的值少于当前时间,说明订单是有效的,可以对订单进行下一步的操作,如果该字段的值大于当前时间,直接更新订单状态为取消。 (不需要清理,在数据新增的时候设置一个过期时间,用户付款的时候检查该订单是否在有效期之内就可以了。)

2、每天凌晨定时处理(一条sql语句搞定),订单有效时间截止昨天晚上23:59:59秒的非已下单未处理订单,批量状态改成无效。

混合处理的好处:
1、节省资源
2、显示结果的准确性。


1.quartz,每几分钟执行一次(根据订单处理速度,和订单生成情况)。
2.没次指定其中的更新条数,例如前1000条。
3.这种方式的确会影响性能,所以要是系统订单比较多,推荐独立的定时服务器。


1、可以创建一个queue(LinkedBlockingQueue),当有新的订单时将该订单放入queue,(这里可以保证该queue是按照过期时间顺序排列的,较后的对象会更晚过期)。

2、另起一个线程A,对该queue读,读到一个尚未过期且未完成的订单则计算离过期的时间xx毫秒,然后将线程A进行sleep(xx),或者wait(xx);随你喜欢了。读到已完成的订单则直接poll(),读到未完成的订单就让它过期掉就好了。

3、可能出现的问题:一些已预订并且已完成的订单可能在3天之内一直存在于该queue中,对内存造成不必要的负担。如果希望能及时清理掉的话,可能需要自己实现该queue,毕竟队列里的内容都是有序的,根据需要移除订单的生成时间,用一个二分法查找是可以很快定位到该对象的。基于链表实现的queue需要移除该链表的一个元素对楼主肯定不会有什么问题吧。


参考自:
http://www.iteye.com/problems/102038
http://bbs.csdn.net/topics/390213669

0 0
原创粉丝点击