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

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的锁定失败): 这

我正在使用bull队列来处理作业

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

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

我尝试过的事情:

  • 创建作业时设置
    尝试次数:1
    (也尝试了0)
  • 使用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});