本文基于java搭建了一个实现 期限时间内 未付款,自动取消订单的简单示例,仅于控制台逻辑实现,所用到的Springboot,delayqueue。
技术介绍
- delayqueue 延迟队列
java延迟队列提供了在指定时间才能获取队列元素的功能,队列头元素是最接近过期的元素。没有过期元素的话,使用poll()方法会返回null值,超时判定是通过getDelay(TimeUnit.NANOSECONDS)方法的返回值小于等于0来判断。延时队列不能存放空元素。
简单理解:
delayqueue就是一个队列,里面有数个queue,每个queue都是一条订单,而且都绑定了订单的过期时间(怎么绑定,看下面代码),越快过期的订单,越会往delayqueue队列的前面排,以此排列,可以通过线程执行take()将过期的queue(到期且未付款的订单)自动清除。
示例代码
pom.xml
其实没什么特别的依赖就是一个时间辅助和lombok
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
application.yml
server:
port: 8899
order:
isOpen: 1
util(工具类)
package com.delayqueue.demo.util;
import lombok.Data;
/**
* @author lyj
* @version 1.0
* @date 2021/2/3 16:08
*/
@Data
public class ReturnT {
private Integer code;
private String mgs;
private Object data;
public ReturnT() {
this.code = 200;
}
public ReturnT(Integer code, String mgs) {
this.code = code;
this.mgs = mgs;
}
public ReturnT(Integer code, String mgs, Object data) {
this.code = code;
this.mgs = mgs;
this.data = data;
}
public static ReturnT getSuccess(){
return new ReturnT(200,"执行成功!");
}
public static ReturnT getFail(String mgs){
return new ReturnT(400,mgs);
}
}
Order(实体类)
package com.delayqueue.demo.entity;
import lombok.Data;
import java.util.Date;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
/**
* @author luoyangjie
* @version 1.0
* @date 2021/2/3 15:17
*/
@Data
public class Order implements Delayed {
/**
* 订单号
*/
private String orderNo;
/**
* 用户id
*/
private String userId;
/**
* 订单状态(0待领取,1已领取,2已勾销)
*/
private Integer status;
/**
* 订单创立时间
*/
private Date createTime;
/**
* 订单失效时间
*/
private Date cancelTime;
public Order(String orderNo, String userId, Integer status, Date createTime, Date cancelTime) {
this.orderNo = orderNo;
this.userId = userId;
this.status = status;
this.createTime = createTime;
thi
922



被折叠的 条评论
为什么被折叠?



