如何在 Rails 4 上实现类似 cron 作业
Posted
技术标签:
【中文标题】如何在 Rails 4 上实现类似 cron 作业【英文标题】:How to implement something like cron jobs on Rails 4 【发布时间】:2015-12-18 00:05:47 【问题描述】:我正在 Rails 4 中开发一个应用程序,但不确定如何实现某个功能:基本上我需要实现某种 cron 作业。例如,假设我在我的应用程序中创建了一张发票。我需要该应用程序来检查发票到期日并向客户发送未支付发票的提醒。我想在没有用户输入的情况下实现这一目标。
我怎样才能做到这一点?
我一直在考虑这个问题,并考虑使用像whenever 这样的工具,它会经常检查数据库。
但是还有其他方法吗?更有效率的东西?
谢谢
编辑:我试图避免的低效率:
我设想的可行方式是:
发票已创建。选择了到期日。此日期会自动添加到集合中(我使用的是 Mongoid,但可能与表格相同) 每天(gem)或 cron 作业都会启动一个脚本/方法/函数来检查上述集合中的条目。如果发现到期日期在某个时间范围内的条目(例如在 3 天内到期)将启动另一个脚本/方法来通知客户发票即将到期。我担心如果有数千张发票,检查所有条目并检查它们是否在特定时间范围内可能会占用大量资源。那么,有没有更好的解决方案?
【问题讨论】:
您将不得不使用 CRON,因为它是操作系统级别的实现。 CRON 只是触发一个脚本,在你的情况下是一个 Ruby 脚本 寻找whenever
gem。如果你使用的是sidekiq,你可以使用sidekiq-scheduler
:) 问题中链接的when gem?
关于针对 cron 运行 Rails 代码见gotealeaf.com/blog/cron-jobs-and-rails
如果您想知道 CRON 的哪些低效问题/当您试图避免时,这会很有趣,并且在答案方面很有帮助?主要问题通常是可能需要启动整个 Rails 环境来做一些简单的事情,但可能还有其他事情你试图避免。
【参考方案1】:
作为 cron 的替代方案,您可以将此 gem 用于延迟作业:
https://github.com/amitree/delayed_job_recurring
Sidekiq 也有周期性工作(虽然它只存在于 sidekiq pro 中):
https://github.com/mperham/sidekiq/wiki/Ent-Periodic-Jobs
【讨论】:
【参考方案2】:如果您在 Heroku 上进行部署,您可以使用 Heroku scheduler。我已将它用于各种任务,例如备份、分析、计数等。
对于 Rails 应用程序,您可以创建 rake 任务来运行特定命令,然后使用调度程序定期运行 rake 任务。
【讨论】:
我没有使用 Heroku。【参考方案3】:我将作业定义为正常的控制器操作并为其设置路由。
使用render json: @records
我返回更新记录的列表。
(此外,我必须通过更改 application_controller.rb 中的 before 过滤器来避免通常需要的登录)。
我可以在浏览器中测试它。
我尝试对定义的路线进行wget
(或 curl)查询
并将其放在用户crontab中(crontab -e
)
我选择这个解决方案,因为我不想使用额外的 gem 或者启动 rails runner 任务,这在启动时非常慢并且消耗大量内存。
【讨论】:
以上是关于如何在 Rails 4 上实现类似 cron 作业的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails如何在Windows 10中随时启动cron
使用日常 cron 作业在 Rails 中使用 Ice Cube 创建的事件的正确方法