延迟队列andRedis:未支付订单的却分钟自动关闭

定时任务:10秒执行

import com.basetnt.sun.valley.service.DelayService;
import com.basetnt.sun.valley.service.RoomOrderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.ParseException;
@Component
public class OrderTask {

    @Autowired
    private DelayService delayService;


    private final static Logger log = LoggerFactory.getLogger(com.basetnt.sun.valley.task.ScheduleTask.class);

    @Scheduled(cron = "0/10 * *  * * ? ")
    public void run() throws ParseException {
        delayService.payPoll();
    }
}

继承队列:放入队列的实体类


import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class OrderExt implements Delayed {

    private String orderId;
    private long startTime;

    /**
     * orderId:订单id
     * timeout:自动取消订单的超时时间,秒
     */
    public OrderExt(String orderId, int timeout) {
        this.orderId = orderId;
        this.startTime = System.currentTimeMillis() + timeout * 1000L;
    }

    @Override
    public int compareTo(Delayed other) {
        if (other == this) {
            return 0;
        }
        if (other instanceof OrderExt) {
            OrderExt otherRequest = (OrderExt) other;
            long otherStartTime = otherRequest.getStartTime();
            return (int) (this.startTime - otherStartTime);
        }
        return 0;
    }

    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(startTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public long getStartTime() {
        return startTime;
    }

    public void setStartTime(long startTime) {
        this.startTime = startTime;
    }

}

队列的相关操作

import com.basetnt.sun.valley.entityExt.OrderExt;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.ParseException;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.TimeUnit;

@Slf4j
@Service
public class DelayService {

    @Autowired
    private RoomOrderService roomOrderService;


    private boolean start;
    private OnDelayedListener listener;
    private DelayQueue<OrderExt> delayQueue = new DelayQueue<OrderExt>();


    public static interface OnDelayedListener {
        public void onDelayedArrived(OrderExt order);
    }


    public void start(OnDelayedListener listener) {
        if (start) {
            return;
        }
        log.error("DelayService 启动");
        start = true;
        this.listener = listener;
        new Thread(new Runnable() {
            public void run() {
                try {
                    while (true) {
                        OrderExt order = delayQueue.take();
                        if (DelayService.this.listener != null) {
                            DelayService.this.listener.onDelayedArrived(order);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /**
     * 添加
     *
     * @param order
     */
    public void add(OrderExt order) {
        delayQueue.put(order);
    }


    /**
     * 删除
     *
     * @param orderId
     */
    public void remove(String orderId) {
        OrderExt[] array = delayQueue.toArray(new OrderExt[]{});
        if (array == null || array.length <= 0) {
            return;
        }
        OrderExt target = null;
        for (OrderExt order : array) {
            if (order.getOrderId() == orderId) {
                target = order;
                break;
            }
        }
        if (target != null) {
            delayQueue.remove(target);
        }
    }


    /**
     * 轮询队列
     */
    public void payPoll() throws ParseException {
        //循环延时队列,判断是否有元素,有则表示有过时未支付订单,(在队列中的数据“过期”之后才能返回数据,不然只能获取到null。)
        //获取到订单的id,得到订单信息,删除redis中的key,删除队列中的该订单
        //将订单状态改为已取消。。。
        if (delayQueue != null && delayQueue.size() > 0) {
            for (OrderExt orderExt : delayQueue) {
                String orderId = orderExt.getOrderId();
                if (orderExt.getDelay(TimeUnit.MILLISECONDS) <= 0) {
                    //执行的操作
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值