本文主要是介绍超时未支付算不算取消一次订单_订单超过二十四小时未付款,就取消,实现该功能的几种姿态...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
网上商城有一个很常见的应用场景:一个订单未付费,二十四小时后自动取消,这个在程序上如何实现,有几种实现方法,每种方法的利弊是什么?
第一种方法:写个定时任务,在某个时间节点,定时检索订单表,有超过二十四小时的订单,统统修改为订单已取消;
实现难易程度:很容易实现,写个定时任务就可以了。
利:不会漏掉订单,只要是超过二十四小时未付款的订单,都可以被检索到、取消掉。
弊:不管有没有订单生成,有没有超过二十四小时未付款的订单,到了时间就必须去数据库检索。另外定在一个特定的时间点去执行数据库查询,会有过期未付款的订单处理的没那么及时。
定时任务代码实现参考:
第二种方法:在订单生成的时候,就把订单号放在缓存里,或是异步任务里,让它等待二十四小时;二十四小时后,再根据订单号去数据库中检索,查看该订单是否付款,如果已经付款了,操作结束;否则,执行订单取消的动作。
实现难易程度:很容易实现,写个异步的任务,到点后,再跟踪该订单的付款状态就可以了。
利:没有订单生成,就不用去数据检索;有订单生成,到点后,才根据订单号去数据库检索,检索到了未付款的订单,再做取消订单的动作。
弊:放在缓存里,或异步任务里,如果遇到服务器异常,被迫重启了,那么这个订单号就丢失了,就会有遗漏的该取消却未取消的订单。如果生成的订单很多,那么就会堆积很多异步任务,会不会影响性能呢,不好说。
线程代码实现参考:
睡二十四个小时,如何睡?
代码实现一:
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使用参考
这篇关于超时未支付算不算取消一次订单_订单超过二十四小时未付款,就取消,实现该功能的几种姿态...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!