如何在Bull中为Redis队列的每个任务设置自动过期TTL?
Bull队列任务自动设置TTL(生存时间)实现方案
Bull没有直接对应Redissetex的单参数全局TTL配置,但可以通过以下方式实现任务创建24小时后自动删除的需求:
方案1:配置任务自动删除参数(针对已处理完成/失败的任务)
在调用add方法添加任务时,在第二个配置参数中加入removeOnComplete和removeOnFail字段,取值为保留时长的毫秒数,修改后的代码如下:
const webApiProducer = (data) => { webApiQueue.add(data, { lifo: true, // 任务执行成功后保留24小时自动删除 removeOnComplete: 86400000, // 任务执行失败后保留24小时自动删除 removeOnFail: 86400000 }) }
方案2:搭配clean方法清理未消费的过期任务
如果需要把还没被消费者拉取处理的等待状态任务也在创建24小时后自动清理,可以搭配队列的clean方法定期批量清理过期任务:
// 队列初始化后添加定时清理逻辑,每小时执行一次 setInterval(async () => { const expireTime = 86400000; // 24小时对应的毫秒数 // 清理等待队列中超时的任务 await webApiQueue.clean(expireTime, 'wait'); // 清理延迟队列中超时的任务 await webApiQueue.clean(expireTime, 'delayed'); // 清理完成队列中超时的任务 await webApiQueue.clean(expireTime, 'completed'); // 清理失败队列中超时的任务 await webApiQueue.clean(expireTime, 'failed'); }, 3600000) // 每小时执行一次
补充适配:执行前判断任务有效性
如果要求过期任务即使被消费者拉取到也不执行,可以在消费逻辑开头增加创建时间判断:
webApiQueue.process(async (job) => { // 任务创建超过24小时直接跳过执行 if (Date.now() - job.timestamp > 86400000) { return '任务已过期,无需执行'; } // 原有业务执行逻辑 })
内容的提问来源于stack exchange,提问作者Ben in CA
相关产品推荐
相关产品推荐

