package com.yanzuoguang.redis; import com.yanzuoguang.util.helper.DateHelper; import java.util.Date; /** * 添加途比达任务 * * @author 颜佐光 */ public class PlanInfo<T> { public static final long HEART_MAX = 10 * 1000; /** * 编号,判断时间是否满足 */ private volatile long id; /** * 获取当前时间是否满足,这里记录上次执行时间(用于时间隔天执行对比) */ private volatile long time; /** * 心跳时间 */ private volatile long heart; /** * 缓存数据 */ private volatile T data; /** * 途比达任务参数 */ public PlanInfo() { this.id = System.currentTimeMillis(); this.time = 0; } /** * 任务信息 * * @param id 任务Id * @param data 数据 */ public PlanInfo(long id, T data) { this.id = id; this.data = data; } /** * 任务Id是否相等 * * @param newId 新Id * @return 是否能够满足新Id */ public boolean isId(long newId) { return newId > this.getId() || newId == this.getId(); } /** * 是否执行 * * @param newId 新Id * @param times 时间差 * @return 是否能够运行 */ public boolean isActive(long newId, long times) { if (newId > this.getId()) { return true; } else { long now = System.currentTimeMillis(); if (now - this.heart < HEART_MAX) { return false; } return newId == this.getId() && now - this.getTime() >= times; } } /** * 心跳执行函数 */ public void heart() { this.heart = System.currentTimeMillis(); } /** * 心跳执行完成 */ public void heartFinish() { this.heart = 0; } /** * 间隔N天后第N个小时执行 * * @param day N天 * @param hour N小时 * @return 下次执行间隔时间 */ public int getNextDayHourMillSecond(int day, int hour) { if (this.getTime() == 0) { return 0; } // 上次执行时间 Date prevTime = new Date(this.getTime()); String prevToday = DateHelper.getToday(prevTime); // 通过MQ设置明天凌晨2点开始计算 Date nextDay = DateHelper.addDay(DateHelper.getDateTime(prevToday), day); Date nextDayHour = DateHelper.addHour(nextDay, hour); // 下次执行时间 long dedTime = Math.max(0, nextDayHour.getTime() - this.getTime()); return (int) dedTime; } public long getId() { return id; } public void setId(long id) { this.id = id; } public long getTime() { return time; } public void setTime(long time) { this.time = time; } public T getData() { return data; } public void setData(T data) { this.data = data; } }