如何在重新启动服务器时阻止bull队列自动重新启动作业



我正在使用布尔队列来处理作业。

假设当我重新启动开发服务器时,一个作业正在以active的状态运行。当工作脚本再次启动时,队列中的进程仍设置为active,因此bull决定再次启动工作进程。

这很快就会造成破坏,因为脚本在开发过程中经常重新启动,所以许多进程最终都会运行并将事情搞得一团糟。我只想在服务器启动时不要重新启动这些作业。

我尝试过的东西:

  • 创建作业时设置attempts: 1(也尝试过0(https://github.com/OptimalBits/bull/blob/HEAD/REFERENCE.md#queueadd
  • 使用queue.clean(((https://github.com/OptimalBits/bull/blob/HEAD/REFERENCE.md#queueclean)
  • 编写脚本以删除活动作业(throws错误:作业xx缺少锁失败(:
let active_jobs = await queue.getJobs(['active']);
active_jobs.forEach(async (active_job) => {
await active_job.discard()
await active_job.moveToFailed(new Error("Auto-killed during dev server restart"))
})

这些都不起作用。有人能解决这个问题吗?

尝试

queue.obliterate({force: true});

之后队列被暂停,所以你必须重新启动它。

如果您有所需的功能,这实际上很容易。您可以实现一些代码来完全清除特定的队列。一旦你的服务器启动,这个代码就必须存在于一个被称为一次性的地方。因此,一个好的地方应该是类的构造函数(生产者服务器的构造函数(。这样,出于开发目的,您总是从零条目的干净队列开始。因此,最好的方法是将清空队列的函数调用包装成适合开发条件的语句。

您可以使用以下内容:

const getKeys = async (q) => {
const multi = q.multi();
multi.keys('*');
const keys = await multi.exec();
return keys[0][1]
}
const filterQueueKeys = (q, keys) => {
const prefix = `${q.keyPrefix}:${q.name}`;
return keys.filter(k => k.includes(prefix));
}
const deleteKeys = async (q, keys) => {
const multi = q.multi();
keys.forEach(k => multi.del(k));
await multi.exec();
}
const emptyQueue = async (q) => {  
const keys = await getKeys(q);
const queueKeys = filterQueueKeys(q, keys);
await deleteKeys(q, queueKeys);
}
if (process.env === 'development') {
emptyQueue(this.workerQueue).then(() => {
console.log('QUEUE EMPTY!')
})
}

最新更新