定义一个Task类,要实现Delayed接口
@Data
public class Task<I> implements Delayed {
private long startTime;
private I classes;
public Task(I classes, long delay, TimeUnit unit) {
this.classes = classes;
this.startTime = System.currentTimeMillis() + unit.toMillis(delay);
}
@Override
public long getDelay(TimeUnit unit) {
long diff = startTime - System.currentTimeMillis();
return unit.convert(diff, TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
if (this.startTime < ((Task) o).startTime) {
return -1;
}
if (this.startTime > ((Task) o).startTime) {
return 1;
}
return 0;
}
@Override public String toString() {
return "Task{" +
"startTime=" + startTime +
", classes=" + classes +
'}';
}
}
插入数据并放入到队列中
SharingSpaceVo sharingSpaceVo = new SharingSpaceVo();
sharingSpaceVo.setSharingSpace(space);
sharingSpaceVo.setPaymentRecords(paymentRecords);
sharingSpaceVo.setAdvanceOrder(advanceOrder);
userHandleTask.handSharingSpaceVo(sharingSpaceVo);
@Data
public class SharingSpaceVo {
private ParkAdvanceOrder advanceOrder;
private SharingSpace sharingSpace;
private PaymentRecords paymentRecords;
}
/**
* 用户端 私有 延迟 异步处理 10分钟处理
*
* @param
*/
public void handSharingSpaceVo(SharingSpaceVo sharingSpaceVo) {
if (sharingSpaceVo == null) {
return;
}
//数据入队
requestQueue.putDelayQueue(new Task(sharingSpaceVo, 10, TimeUnit.MINUTES));
}
创建消费者,要继承Thread类异步消费队列中的数据
/**
* 用户端延迟消费
*/
@Component
public class PutOffConsumer extends Thread {
@Override
public void run() {
while (true) {
try {
Task<?> task = (Task<?>) requestQueue.getDelayQueue().take();
if (task == null) {
continue;
}
Object taskClasses = task.getClasses();
if (taskClasses instanceof SharingSpaceVo) {
SharingSpaceVo sharingSpaceVo = (SharingSpaceVo) taskClasses;
/**
* 私有车位
*/
if (sharingSpaceVo != null) {
SharingSpace sharingSpace = sharingSpaceVo.getSharingSpace();
ParkAdvanceOrder advanceOrder = sharingSpaceVo.getAdvanceOrder();
PaymentRecords paymentRecords = sharingSpaceVo.getPaymentRecords();
/** 订单状态:(0:预约未支付,1:超时未进场已取消,2:超时未支付已取消,3:未入场,4:已入场,5:已完成,6:已取消)) */
String carNumBytes = Base64.encode(advanceOrder.getPlateNumber().getBytes(StandardCharsets.UTF_8));
String advanceFormat = String.format(ParkConstants.advanceOrderKey, advanceOrder.getParkId(), carNumBytes);
ParkAdvanceOrder parkAdvanceOrder1 = redisCache.getCacheObject(advanceFormat);
if ("0".equals(parkAdvanceOrder1.getEntryStatus())) {
String format = String.format(ParkConstants.couponKey, advanceOrder.getParkId(), carNumBytes);
redisCache.deleteObject(format);
// 预约车10分钟都没有支付和入场
// 取消预约
advanceOrder.setEntryStatus("2");
LocalDateTime localDateTime = LocalDateTime.now();
advanceOrder.setCancelOfPayment(localDateTime.format(dateTimeFormatter));
userHandleTask.handleAdvanceOrderList(advanceOrder);
// 删除共享车位
sharingSpace.setStatus("0");
userHandleTask.handleSharingSpaceList(sharingSpace);
paymentRecords.setAddOrDelete(2);
userHandleTask.handlePaymentList(paymentRecords);
}
}
}
}