延时队列 DelayQueue 的简单使用

物联网设备升级场景中,使用DelayQueue替代动态定时任务,简化管理。创建升级任务时,将任务信息(设备ID、升级包、升级时间点)放入队列,设置延时时间。集群部署需考虑分布式锁,服务重启需恢复未执行任务,中断任务需有处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用场景:物联网应用中,硬件版本升级。需要通过线上操作,对某一类型设备,在某个时间点进行升级。

因此需要创建一个升级任务,包含了需要升级的设备信息,升级包,升级时间点等信息。后台根据升级任务,按时升级设备。

 

实现方法一: 动态定时任务。

每次创建或者修改升级时间,升级时间都需要进行一次排序,已最小时间创建定时任务,并取消之前未执行的定时任务。执行完一次任务,再以下一个时间点创建定时任务。

(相对复杂,每次新增或创建都需要对升级时间进行排序,创建,取消定时任务,而且,如果更改的时间如果距离当前时间间隔短,可能会出现,创建定时任务时,任务执行的时间已经过了,导致定时任务不再执行)

方法二:

  使用延时队列  DelayQueue实现。每次创建或修改升级时间,都往队列中添加一个元素,延时时间(通过升级时间点计算)。元素中,需包含任务id,和版本(识别任务时间是否更改过,确保设备升级时间点准确)。

(无须自己排序,只要计算好延时时长即可)

 

考虑情况: 集群部署(用分布式锁,可以使用redis实现),服务挂了(项目重新启动,需要对未执行的任务重新放进队列),任务执行中断(部分设备未进行升级,如何处理)等等。。。

 

package com.rsh.demo.delayq;

import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class MyDelay implements Delayed {
	
	// 延时时长,单位自定义
	private long delayTime;
	private String name;
	
	public MyDelay(long delayTime, String name) {
		this.name = name;
		// 比如使用s
		this.delayTime = d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值