如何解决重新启动服务器时如何阻止公牛队列自动重新启动作业
我正在使用牛市队列来处理作业。
比方说,当我重新启动开发服务器时,作业正在运行,状态为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)
- 编写脚本以删除活动作业(引发错误:作业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"))
})
这些都不起作用。有人有解决方案吗?
解决方法
实际上很容易。 您可以实现一些代码以完全清理特定队列。 服务器启动后,该代码必须存在于一次调用的地方。这样一来,您总是从零条目的干净队列开始。
您可以使用sth。类似于以下内容:
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);
}
emptyQueue(this.workerQueue).then(() => {
console.log('QUEUE EMPTY!')
})
,
试试
queue.obliterate({force: true});
此后队列暂停,因此您必须重新启动它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。