【问题标题】:Bull: Cannot define a handler more than once per Queue instanceBull:每个队列实例不能多次定义处理程序
【发布时间】:2023-04-06 14:59:01
【问题描述】:

我将 bull 与 node.js 一起使用。我正在考虑使用主从模型,其中一个线程将内容放入队列中,另一个线程只是将其从队列中拉出。

但是,当我的工作线程尝试从队列中拉出时,它们会收到以下错误:

错误:每个队列实例不能多次定义处理程序

当我调用这个函数时

var doJobs = function() {
    return Queue.process(job, jobDone) {
        console.log("job done");
        jobDone();
    });
}

谁能告诉我这个错误是什么意思?

【问题讨论】:

  • 嗯,我认为你上面的代码是错误的......另外,你似乎多次调用 doJobs......你可能只需要分配一次处理程序,它只会发送一次给那个处理程序一个工作。
  • 准确分配处理程序是什么意思?我无法理解这个术语
  • 我也不止一次地调用它。我每个线程调用一次。
  • @Gakho node.js 是单线程的,那是什么意思?

标签: node.js bull.js


【解决方案1】:

doJobs 函数被多次点击。我认为这是正确的,实际上,您只需点击一次。

【讨论】:

    【解决方案2】:

    queue.process(job => {/* ... */}) 为描述如何执行作业的队列注册处理处理程序。它实际上并没有像您想象的那样触发现场执行的工作。

    该错误会阻止您重新定义或错误地添加额外的处理处理程序——一个作业只能有一种处理方式。

    当您使用 queue.add() 将作业添加到队列中时,您之前通过传递给 queue.process 注册的处理程序将应用于作业,产生可以使用 await job.finished()queue.on("completed", (job, result) => {/* ... */}) 或例如completion queue

    顺便说一句,你的“主从模型”实际上是一个生产者-消费者模型。主从是指从属完全受主控,但在生产者-消费者中,消费者不需要做任何事情,通常根本不受生产者的控制。

    【讨论】:

      【解决方案3】:

      我在 NestJs 中使用 Bull 时遇到了这个问题。 https://docs.nestjs.com/techniques/queues

      确切的错误是:

      (node:12887) UnhandledPromiseRejectionWarning: 错误: 不能定义同一个处理程序两次默认

      我为不同的处理器(消费者)使用了相同的名称。因此,对于 Bull 队列,它们不仅仅是一个处理器。

      我的复制/粘贴错误!

      一旦我为每个处理器和队列定义了不同的名称,一切就都解决了。

      【讨论】:

        猜你喜欢
        • 2016-06-26
        • 2012-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 2020-10-05
        • 2012-11-12
        相关资源
        最近更新 更多