package com.vci.frameworkcore.ajaxTask; import com.vci.frameworkcore.compatibility.SmUserQueryServiceI; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; /** * 解锁用户的延时任务 * 每个任务的执行时间可能会不一样 * @author weidy * @date 2020/2/5 */ public class SmUserUnLockTask implements Delayed { /** * 用户服务 **/ final private SmUserQueryServiceI userService; /** * 用户的主键 */ final private String userId ; /** * 延时时间 */ final private Long delayTime; public SmUserUnLockTask(SmUserQueryServiceI userService, String userId, Long delayTime) { super(); this.userService = userService; this.userId = userId; this.delayTime = delayTime + System.currentTimeMillis(); } public SmUserQueryServiceI getUserService() { return userService; } public String getUserId() { return userId; } public Long getDelayTime() { return delayTime; } /** * Returns the remaining delay associated with this object, in the * given time unit. * * @param unit the time unit * @return the remaining delay; zero or negative values indicate * that the delay has already elapsed */ @Override public long getDelay(TimeUnit unit) { return unit.convert(this.delayTime - System.currentTimeMillis(), unit); } /** * Compares this object with the specified object for order. Returns a * negative integer, zero, or a positive integer as this object is less * than, equal to, or greater than the specified object. * *

The implementor must ensure sgn(x.compareTo(y)) == * -sgn(y.compareTo(x)) for all x and y. (This * implies that x.compareTo(y) must throw an exception iff * y.compareTo(x) throws an exception.) * *

The implementor must also ensure that the relation is transitive: * (x.compareTo(y)>0 && y.compareTo(z)>0) implies * x.compareTo(z)>0. * *

Finally, the implementor must ensure that x.compareTo(y)==0 * implies that sgn(x.compareTo(z)) == sgn(y.compareTo(z)), for * all z. * *

It is strongly recommended, but not strictly required that * (x.compareTo(y)==0) == (x.equals(y)). Generally speaking, any * class that implements the Comparable interface and violates * this condition should clearly indicate this fact. The recommended * language is "Note: this class has a natural ordering that is * inconsistent with equals." * *

In the foregoing description, the notation * sgn(expression) designates the mathematical * signum function, which is defined to return one of -1, * 0, or 1 according to whether the value of * expression is negative, zero or positive. * * @param o the object to be compared. * @return a negative integer, zero, or a positive integer as this object * is less than, equal to, or greater than the specified object. * @throws NullPointerException if the specified object is null * @throws ClassCastException if the specified object's type prevents it * from being compared to this object. */ @Override public int compareTo(Delayed o) { long delta = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS); return (int) delta; } /** * 对比 * @param obj * @return */ @Override public boolean equals(Object obj) { if (obj instanceof String) { return this.userId.equals(((String) obj)); } return false; } @Override public String toString() { return "SmUserUnLockTask{" + "userService=" + userService + ", userId='" + userId + '\'' + ", delayTime=" + delayTime + '}'; } }