服务器1正在调用此函数:
let job = await transactions.add({ foo: 'bar' });
let status = await job.finished();
console.log(status);服务器2正在按以下方式使用该作业:
transactions.process(QueueOptions.maxConcurrent, async (job, done) => {
done(null, {result: job.data});
});但是,当该作业完成时,服务器1不会收到通知。job.finished()解析的唯一时间是,如果服务器1排队作业,然后启动服务器2。在这种情况下,job.finished()承诺有效。否则,它永远是沉默的。
当服务器2完成任务时,服务器1如何可靠地知道?(一项工作需要10秒或更短的时间完成)
发布于 2019-09-23 19:28:20
您至少有两个选项可实现从一个服务器中的处理器通知另一个服务器中的一个作业完成的结果。
备选案文1
使用全局事件并侦听"completed"事件。例如:
// Server 1
transactions.on("global:completed", (jobId, result) => {
// Job completed
}); 这个选项的支持者是直截了当的。但是,在Bul3.x中,事件并不一定总是到达其目的地,例如,在网络分区或Redis断开连接的情况下。如果可以接受很少数量的结果未被完全通知,则可以使用此方法。
选项2
使用这里描述的返回作业完成模式:https://github.com/OptimalBits/bull/blob/develop/PATTERNS.md#returning-job-completions
它的工作方式是定义一个新队列,让我们将其命名为results,在此您可以在最后化之前添加处理器的结果,如下所示:
// Server 2
transactions.process(QueueOptions.maxConcurrent, async (job) => {
const result = {result: job.data}
await results.add(job.data);
return result
});在需要侦听结果的服务器(或服务器)上,只需创建一个处理结果的处理器:
// Server 1
results.process( (job) => {
// Do something with the result from the transaction queue...
});此解决方案的优点是健壮性。基本上,您将不会丢失事务队列的任何结果,而代价是代码复杂度的增加。
发布于 2019-10-24 23:39:15
我和行动组有同样的问题。接受的答案起作用了,并且让我找到了解决方案的大部分方法,但是你仍然需要建立一种方法来真正得到工作的结果。
我在寻找能让我做的事情:
const result = await jobQueue.doJob('foo', {foo: 'bar'});使用上面的选项1中描述的策略,我构建了一个工具,希望其他登陆这里的人能找到有用的工具。
它的要点是使用进程范围的EventEmitter寄存器,并删除Bull‘全局:已完成’和‘全局:失败’事件的侦听器。然后,我用决心或拒绝将承诺映射到以下对jobQueue.doJob链接的特定调用:
https://www.npmjs.com/package/bullrack https://github.com/joewagner/bullrack
希望这能节省一些人的时间。这个包仍然需要测试,但是反馈是非常受欢迎的。
https://stackoverflow.com/questions/57844686
复制相似问题