Javascript 如何在重新启动服务器时阻止bull queue自动重新启动作业
我正在使用bull队列来处理作业 假设当我重新启动dev服务器时,作业正在运行,状态为Javascript 如何在重新启动服务器时阻止bull queue自动重新启动作业,javascript,node.js,queue,worker,bull-queue,Javascript,Node.js,Queue,Worker,Bull Queue,我正在使用bull队列来处理作业 假设当我重新启动dev服务器时,作业正在运行,状态为active。当工作进程脚本再次启动时,队列中的进程仍然设置为活动,因此bull决定再次启动工作进程 这很快就会造成破坏,因为脚本经常在开发过程中重新启动,所以许多进程最终都会运行起来,把事情弄得一团糟。我只想在服务器启动时不要重新启动这些作业 我尝试过的事情: 创建作业时设置尝试次数:1(也尝试了0) 使用queue.clean()() 正在编写脚本以删除活动作业(引发错误:缺少作业xx的锁定失败): 这
active
。当工作进程脚本再次启动时,队列中的进程仍然设置为活动
,因此bull决定再次启动工作进程
这很快就会造成破坏,因为脚本经常在开发过程中重新启动,所以许多进程最终都会运行起来,把事情弄得一团糟。我只想在服务器启动时不要重新启动这些作业
我尝试过的事情:
- 创建作业时设置
(也尝试了0)尝试次数:1
- 使用queue.clean()()
- 正在编写脚本以删除活动作业(引发错误:缺少作业xx的锁定失败):
这些都不管用。任何人都有一个解决方案来实现这一点吗?如果你有所需的功能,这其实很容易。 您可以实现一些代码来完全清理特定队列。 一旦服务器启动,这些代码必须驻留在一个叫做一次性的地方。因此,一个好的位置应该是类(生产者服务器)的构造函数。这样,出于开发目的,您总是从一个没有条目的干净队列开始。所以最好是将清空队列的函数调用封装到一些语句中,这些语句支持开发条件 您可以使用以下内容:
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!')
})
}
试一试
之后,队列将暂停,因此您必须重新启动它
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!')
})
}
queue.obliterate({force: true});