【问题标题】:NodeJS Periodic tasksNodeJS 定期任务
【发布时间】:2016-05-04 23:22:44
【问题描述】:

首先,我将解释我的问题:

我正在开发一个电子商务网站。其中一项功能是客户可以创建购买规则。使用这些规则,客户可以设置开始日期、周期和要购买的产品。结果是从[开始日期]开始每隔[周期]天购买产品。

系统以NodeJS为后端,MongoDB为数据库,AngularJS为前端开发。

我发现了一些在 NodeJS 中调度任务的项目。其中两个是:

它们都是很棒的工具,但我对它们两个有同样的问题。问题是我需要创建计划任务并停止它们。使用这些工具非常清楚如何安排一个函数随时间执行,但我怎样才能随时停止它们呢?

node-schedule 和 node-cron 提供的对象有一个 cancel() 或 stop() 方法来停止调度,但要调用该方法我需要拥有该对象。

我的问题是,是否有办法将计划任务“存储”在数据库中,以便能够在任何时候从它们创建的函数以外的任何地方停止它们。

如果这是不可能的,如果有比我提到的更好的工具来做我需要的事情。

非常感谢您的阅读,我们将不胜感激。

【问题讨论】:

  • 试试这个议程(github.com/rschmukler/agenda),我没用过,但它可以让你将计划任务保存在选定的数据库中,如 MongoDB 或 redis。另外,为什么你不能创建一个简单的程序来将你的任务保存在数据库中,并创建一个子进程来持续运行、检查和执行你的操作。这只是一个建议。如果你有兴趣,我很乐意贡献,因为,我和其他人可能需要它。无论如何,让我们等待其他人 cmets,他们可能会有所帮助。
  • 谢谢!看起来那个包正是我需要的。你让我今天一整天都感觉很好。再次感谢您。

标签: angularjs node.js cron scheduled-tasks scheduling


【解决方案1】:

好的,我找到了比添加一堆计划任务(一个用于购买规则)更好的解决方案。现在我的 purchase_rules 表如下所示:

+--------------------+
|   purchase_rules   |
+--------------------+
| customer_id        |
| product_id         |
| quantity           |
| start_date         |
| periodicity (Days) |
+--------------------+

我的解决方案是在下次运行时添加该字段,因此我的表格将如下所示:

+--------------------+
|   purchase_rules   |
+--------------------+
| customer_id        |
| product_id         |
| quantity           |
| start_date         |
| periodicity (Days) |
| next_run           |
+--------------------+

默认情况下 [next_run] 将为 [start_date] + [periodictiy]。

现在,魔法:

我将使用node-schedule 来安排每天某个时间的工作。该工作将执行以下操作:

  1. 在 purchase_rules 表中查找 next_run = today 的任何规则
  2. 对于找到的每个规则:
    1. 为客户 [customer_id] 购买所需的 [数量] 产品 [product_id]
    2. 使 [next_run] = [next_run] + [periodicity]
  3. 完成

这样,数据库的访问次数不会像使用议程包那样多次,并且为了“停止”购买规则,我只需将其从数据库中删除即可。

我希望有一天有人会发现这很有用。

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多