订单一定时间未支付-回仓(Timer实现)

做商品支付的开发过程中,一个必须考虑到的环节:用户在点击下单购买,同时也点击了支付,这时候由于各种原因,用户长时间未支付,对于库存有限的商品来说,一般会将当前订单的商品库存锁定一段时间,这段时间一过,还未支付,库存自动回库,同时修改支付状态,可以参照下淘宝的生成订单未支付过程。

1:可以使用java中自带的api–Timer , 但是操作比较繁琐 。

2:电商项目中引入第三方插件:石英钟quartZ

3:定时任务逻辑: 设置24小时支付超时
如何判断一个订单是否超时?
订单中有status(订单状态 1未付款 2已付款 3未发货4已发货5交易成功 6交易失败)字段和createTime(订单生成时间)字段 , 检索订单表中创建时间距离现在大于24 , 并且status为1 的数据 , update status为6。
如果判断超时 , 后续如何处理?
update status为6(订单失效) , 对应的商品数量回退归还库存

4:使用rubbitmq消息队列

这里使用定时器Timer(队列机制)
正常生成订单支付:生成订单即触发timer,支付成功后,取消该定时器。
①:提交订单方法 结束之前调用定时器里面的修改订单状态方法。

②:提交订单时 设置24小时未付款会执行此方法,修改状态为已关闭。

③:在订单付款的方法结束时也需要调用定时器关闭方法,否则订单状态也会修改为已关闭

package cn.timer;

import java.util.Timer;
import java.util.TimerTask;
import org.apache.log4j.Logger;

public class CommTimer {
private static final Logger out = Logger.getLogger(CommTimer.class);
	/**
	 * 订单关闭(设置指定24小时后,修改订单状态为已关闭)
	 * @param bolId  订单号
	 */
	public static void orderClose(final String bolId) {
		final Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				//SpringContextUtils为自定义类,通过反射机制直接操作业务层接口OrderService
				OrderService os= SpringContextUtils.getBean(OrderService.class);
				try {
					Integer ret = os.updateState(bolId,0);
					if(ret > 0) {
						out.info("订单号:"+bolId+"已关闭");
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
				// 中断线程
				timer.cancel();
			}
		},24*60*60*1000);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章