【问题标题】:How to stop bull queue from automatically restarting jobs when restarting the server重启服务器时如何阻止公牛队列自动重启作业
【发布时间】:2020-09-29 21:03:53
【问题描述】:

我正在使用公牛队列来处理作业。

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

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

我尝试过的事情:

    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"))
    })

这些都不起作用。任何人都有解决方案来实现这一目标?

【问题讨论】:

    标签: javascript node.js queue worker bull-queue


    【解决方案1】:

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

    你可以使用类似下面的东西:

    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!')
        })
    }
    

    【讨论】:

      【解决方案2】:

      试试

      queue.obliterate({force: true});
      

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

      【讨论】: