4

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

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

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

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

目前这个解决方案对我来说看起来不错,因为它很好地分离了关注点,但是,我有以下问题:

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

1 回答 1

5
  1. 与“processRecurringInvoices”不同,将其视为启动其他单独发票处理作业的作业可能更容易。以这种方式考虑,一旦发票处理作业已入队,您可以安全地调用 done() 来启动它们的作业。
  2. 以问题 1 中描述的方式思考问题,应在每个单独的发票处理作业中处理错误。如果在查找潜在发票作业时发生错误,则可能会在 processRecurringInvoices 作业中进行处理。
  3. 您可以使用它kue.Job.rangeByType()来搜索当前活跃的工作。如果作业处于活动状态,您可以跳过再次启动它。
于 2013-09-16T22:22:55.110 回答