如何在Rails 4上实现类似cron作业的东西

时间:2015-09-21 10:17:49

标签: ruby-on-rails cron recurring-billing

我在Rails 4中开发应用程序并且不确定如何实现某个功能:基本上我需要实现某种类型的cron作业。例如,我们说我在我的应用中创建了发票。我需要该应用程序检查发票到期日期,并向客户发送提醒尚未支付发票的提醒。我想在没有用户输入的情况下实现这一点。

我怎样才能做到这一点?

我一直在考虑这个问题,并考虑过使用像whenever这样经常检查数据库的工具。

但还有另一种方法吗?更高效的东西?

由于

编辑:我试图避免效率低下:

我设想的方法可行:

  • 已创建发票。选择截止日期。此日期会自动添加到集合中(我使用Mongoid,但可能与表格相同)
  • 每当(gem)或cron作业每天都会启动一个脚本/方法/函数来检查上述集合中的条目。如果在特定时间范围内找到具有截止日期的条目(例如在3天内到期),则会启动另一个脚本/方法以通知客户发票即将到期。

我担心的是,如果有数千张发票,检查所有条目并检查它们是否在特定时间范围内可能需要大量资源。那么,有更好的解决方案吗?

3 个答案:

答案 0 :(得分:0)

作为cron的替代品,你可以将这个宝石用于延迟工作:

https://github.com/amitree/delayed_job_recurring

Sidekiq也有定期工作(虽然它只出现在sidekiq pro中):

https://github.com/mperham/sidekiq/wiki/Ent-Periodic-Jobs

答案 1 :(得分:0)

如果您在Heroku上部署,则可以使用Heroku scheduler。我已将它用于各种任务,如备份,分析,计数等。

对于rails应用程序,您可以创建rake任务以运行特定命令,然后使用调度程序定期运行rake任务。

答案 2 :(得分:0)

我将作业定义为正常的控制器操作,并为其设置了路由。 使用render json: @records返回更新记录的列表。 (另外,我必须通过更改application_controller.rb中的before过滤器来避免通常需要的登录)。

我无法在浏览器中对其进行测试。

我尝试了wget(或curl)查询到定义的路由 并将其放置在用户crontab(crontab -e

之所以选择此解决方案,是因为我不想使用其他gems或启动RailsRunner任务,因为它启动时很慢,而且会占用大量内存。