延迟队列不需要不停的扫描缓存、任务、轮训等,它能够实现在准确的时间点去执行任务。
TaskBase类 自己定义,例如:你执行任务时候所需要的数据! 这个类会被当做delayQueue 里面的Key ,增加任务,或者删除任务,用它来标识
public class DelayTask implements Delayed {
/**
* 任务ID
*/
final private TaskBase data;
/**
* 延时时间
*/
final private long expire;
/**
* 构造延时任务
* @param data 业务数据
* @param expire 任务延时时间(ms)
*/
public DelayTask(TaskBase data, long expire) {
super();
this.data = data;
this.expire = expire + System.currentTimeMillis();
}
public TaskBase getData() {
return data;
}
public long getExpire() {
return expire;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(this.expire - System.currentTimeMillis(), unit);
}
@Override
public int compareTo(Delayed o) {
long delta = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);
return (int) delta;
}
@Override
public String toString() {
return "DelayTask{" +
"data='" + data + '\'' +
", expire=" + expire +
'}';
}
@Component
public class DelayQueueManager implements CommandLineRunner {
private final Logger logger = LoggerFactory.getLogger(DelayQueueManager.class);
//保存 需要执行的信息
private DelayQueue<DelayTask> delayQueue = new DelayQueue<>();
//这个是我的 业务类,注入进来,方便在下面调用
@Autowired
private TimedTask timedTask;
/**
* 加入到延时队列中
* @param task
*/
public void put(DelayTask task) {
delayQueue.put(task);
}
/**
* 删除延时任务
* @param taskid
* @return
*/
public boolean remove(String taskid) {
//xxxxxx 是指DelayTask类,这个类是作为Key的
return delayQueue.remove(xxxxxx);
}
/**
* 项目启动后开启一个线程 用来执行延时任务
* @param args
* @throws Exception
*/
@Override
public void run(String... args) throws Exception {
Executors.newSingleThreadExecutor().execute(new Thread(this::excuteThread));
}
/**
* 延时任务执行线程
*/
private void excuteThread() {
while (true) {
try {
/**
* 获取需要执行的 延时任务信息
*/
DelayTask task = delayQueue.take();
//开始执行processTask方法
processTask(task);
} catch (InterruptedException e) {
break;
}
}
}
/**
* 执行延时任务
* @param task
*/
private void processTask(DelayTask task) {
//你的业务逻辑
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- fupindai.com 版权所有 赣ICP备2024042792号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务