超时未支付算不算取消一次订单_订单超过二十四小时未付款,就取消,实现该功能的几种姿态...

efa014da920c

网上商城有一个很常见的应用场景:一个订单未付费,二十四小时后自动取消,这个在程序上如何实现,有几种实现方法,每种方法的利弊是什么?

第一种方法:写个定时任务,在某个时间节点,定时检索订单表,有超过二十四小时的订单,统统修改为订单已取消;

实现难易程度:很容易实现,写个定时任务就可以了。

利:不会漏掉订单,只要是超过二十四小时未付款的订单,都可以被检索到、取消掉。

弊:不管有没有订单生成,有没有超过二十四小时未付款的订单,到了时间就必须去数据库检索。另外定在一个特定的时间点去执行数据库查询,会有过期未付款的订单处理的没那么及时。

定时任务代码实现参考:

第二种方法:在订单生成的时候,就把订单号放在缓存里,或是异步任务里,让它等待二十四小时;二十四小时后,再根据订单号去数据库中检索,查看该订单是否付款,如果已经付款了,操作结束;否则,执行订单取消的动作。

实现难易程度:很容易实现,写个异步的任务,到点后,再跟踪该订单的付款状态就可以了。

利:没有订单生成,就不用去数据检索;有订单生成,到点后,才根据订单号去数据库检索,检索到了未付款的订单,再做取消订单的动作。

弊:放在缓存里,或异步任务里,如果遇到服务器异常,被迫重启了,那么这个订单号就丢失了,就会有遗漏的该取消却未取消的订单。如果生成的订单很多,那么就会堆积很多异步任务,会不会影响性能呢,不好说。

线程代码实现参考:

睡二十四个小时,如何睡?

代码实现一:

public static void main(String[] argo){

try {

for(int i=0;i<10;i++){

//睡3秒钟,24小时 = 24 * 60 * 60 * 1000

System.currentTimeMillis();

Thread.sleep(3*1000);

System.out.println(System.currentTimeMillis() + ":" +i);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

打印执行结果:

1605789092882:0

一句代码,就让它睡了。

二十四后执行,不一定睡,还可以使用 Java定时器

代码实现二:

/**

* 测试用例,java定时器

* @param argo

*

*/

public static void main(String[] argo){

System.out.println(System.currentTimeMillis());

Timer timer = new Timer();

timer.schedule(new TimerTask(){

@Override

public void run() {

System.out.println(System.currentTimeMillis() + ": 执行任务");

}

}, 3 *1000); //3秒后执行,24小时 = 24 * 60 * 60 * 1000

}

执行结果:

1605789480093

以上两种方法都有不足之处,一个耗费性能,没有订单也要白白执行了一次数据库查询;另一个担心服务器重启,还需要补救措施。

在实际操作中,也可以使用第一种方法,忽略对性能的影响;也可以使用第二种,忽略服务器的重启,或者做补救措施,对遗漏的超时未付款订单人工处理,这就需要在管理后台有个操作订单的界面了。

还有没有其他更好的处理方式呢,当然是有的,比如结合redis的使用,利用redis的过期机制,这也是一种思路。

相关redis使用参考


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部