如何阻止bull queue在重启服务器时自动重启作业
How to stop bull queue from automatically restarting jobs when restarting the server
我正在使用 bull queue 来处理作业。
假设当我重新启动我的开发服务器时,作业是 运行 状态 active
。当worker脚本再次启动时,队列中的进程仍然设置为active
,所以bull决定再次启动worker进程
这很快就会造成破坏,因为脚本经常在开发过程中重新启动,所以许多进程最终 运行 并把事情弄得一团糟。我只想在服务器启动时不要重新启动这些作业。
我尝试过的事情:
- 创建作业时设置
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)
- 正在编写脚本以删除活动作业(抛出错误:缺少作业 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"))
})
None 的作品。有人有解决方案吗?
如果你有所需的功能,其实很容易。
您可以实施一些代码来完全清理特定队列。
一旦您的服务器启动,该代码必须位于一个被调用一次的地方。因此,您的 class(producer-server)的构造函数是个好地方。这样一来,出于开发目的,您总是从零条目的干净队列开始。所以最好是将清空队列的函数调用包装到一些证明开发条件的语句中。
您可以使用如下内容:
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});
之后队列暂停,因此您必须重新启动它。
我正在使用 bull queue 来处理作业。
假设当我重新启动我的开发服务器时,作业是 运行 状态 active
。当worker脚本再次启动时,队列中的进程仍然设置为active
,所以bull决定再次启动worker进程
这很快就会造成破坏,因为脚本经常在开发过程中重新启动,所以许多进程最终 运行 并把事情弄得一团糟。我只想在服务器启动时不要重新启动这些作业。
我尝试过的事情:
- 创建作业时设置
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)
- 正在编写脚本以删除活动作业(抛出错误:缺少作业 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"))
})
None 的作品。有人有解决方案吗?
如果你有所需的功能,其实很容易。 您可以实施一些代码来完全清理特定队列。 一旦您的服务器启动,该代码必须位于一个被调用一次的地方。因此,您的 class(producer-server)的构造函数是个好地方。这样一来,出于开发目的,您总是从零条目的干净队列开始。所以最好是将清空队列的函数调用包装到一些证明开发条件的语句中。
您可以使用如下内容:
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});
之后队列暂停,因此您必须重新启动它。