如何使用Kue处理预定的重复性工作?

时间:2013-01-26 08:59:46

标签: node.js worker job-queue kue

在我的网络应用中,用户可以创建需要在每月的特定日期生成和发送的定期发票。例如,可能需要在每个月的5号发送发票。

我正在使用Kue来处理我所有的后台工作,所以我也想在这种情况下这样做。

我目前的解决方案是每小时使用setInterval()创建一个processRecurringInvoices作业。然后,此作业将从数据库中查找所有定期发票,并为每个定期发票创建单独的generateInvoice作业。

generateInvoice作业将实际生成发票,如果需要,还会创建一个sendInvoiceToEmail作业,通过电子邮件发送发票。

目前这个解决方案对我来说很好,因为它有一个很好的关注点,但是,我有以下问题:

  1. 我不确定在主processRecurringInvoices工作上调用done()之前是否应等待所有'子'工作完成?
  2. 我应该在哪里处理错误?我是应该将它们传递回processRecurringInvoices工作还是应该为每项工作单独处理?
  3. 如何确保如果处理需要很长时间(超过一小时),并且processRecurringInvoices或任何子作业仍在运行,则不会再次创建processRecurringInvoices作业?有点像独特的工作,还是互相排斥?

1 个答案:

答案 0 :(得分:5)

  1. 可能更容易将其视为启动其他单独的发票处理作业的工作,而不是“processRecurringInvoices”。通过这种方式思考,一旦发票处理工作入队,您就可以安全地在完成任务的工作上调用done()。
  2. 以问题1中描述的方式思考问题,应在每个单独的发票处理工作中处理错误。如果发现潜在发票作业时发生错误,则可能会在processRecurringInvoices作业中处理。
  3. 您可以使用kue.Job.rangeByType()搜索当前有效的作业。如果某个作业处于活动状态,您可以跳过再次将其踢掉。