package com.pz.system.datastructure; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; /** * <p>created in 2023/9/15 14:55 * * @author WangMin * @version 1.0 */ @Data @Slf4j public class TotalOrderDelayOperator implements Delayed { /** * 主订单ID */ private Long orderId; /** * 订单过期时间 */ private long expirationTime; /** * 订单过期执行操作 */ private Consumer<Long> action; public TotalOrderDelayOperator(Long orderId, long expirationTime, Consumer<Long> action) { this.orderId = orderId; this.expirationTime = expirationTime; this.action = action; } @Override public long getDelay(@NotNull TimeUnit unit) { // 计算订单到期时间和当前时间的时间差,并返回以指定时间单位表示的延迟时间 long diff = expirationTime - System.currentTimeMillis(); return unit.convert(diff, TimeUnit.MILLISECONDS); } @Override public int compareTo(@NotNull Delayed o) { // 比较订单到期时间先后顺序 return Long.compare(expirationTime, ((TotalOrderDelayOperator) o).getExpirationTime()); } /** * 订单过期操作 */ public void operator() { try { if (action != null && orderId != null) { action.accept(orderId); } } catch (Exception e) { log.error("订单延迟任务执行失败 cause:{}", e.getMessage()); } } }