如何在 Rails 4 上实现诸如 cron 作业之类的东西
How to implement something like cron jobs on Rails 4
我正在 Rails 4 开发一个应用程序,但不确定如何实现某个功能:基本上我需要实现某种 cron 作业。例如,假设我在我的应用程序中创建了一张发票。我需要该应用程序来检查发票到期日并向客户发送发票尚未支付的提醒。我想在没有用户输入的情况下实现这一点。
我怎样才能做到这一点?
我一直在考虑这个问题,并考虑使用像 whenever 这样的工具,它会经常检查数据库。
但是还有其他方法吗?更有效率的东西?
谢谢
编辑:我试图避免的低效率:
我设想的可行方式是:
- 发票已创建。选择了截止日期。此日期会自动添加到集合中(我使用的是 Mongoid,但可能与 table 相同)
- 每天(gem)或 cron 作业都会启动一个 script/method/function 来检查上述集合中的条目。如果发现到期日期在特定时间范围内(例如 3 天内到期)的条目,将启动另一个 script/method 以通知客户发票即将到期。
我担心的是,如果有数千张发票,检查所有条目并检查它们是否在特定时间范围内可能会占用大量资源。那么,有没有更好的解决方案呢?
作为 cron 的替代方案,您可以将此 gem 用于延迟作业:
https://github.com/amitree/delayed_job_recurring
Sidekiq 也有定期作业(虽然它只存在于 sidekiq pro 中):
如果你在 Heroku 上部署,你可以使用 Heroku scheduler。我已经将它用于各种任务,例如备份、分析、计数等。
对于 rails 应用程序,您可以创建一个 rake 任务以执行 运行 特定命令,然后使用调度程序定期 运行 rake 任务。
我将作业定义为正常的控制器操作并为其设置了路由。
用 render json: @records
我 return 更新记录的列表。
(此外,我不得不通过更改 application_controller.rb 中的 before 过滤器来避免通常需要的登录)。
我可以在浏览器中测试它。
我尝试对定义的路由进行 wget
(或 curl)查询
并将其放入用户 crontab (crontab -e
)
我选择这个解决方案,因为我不想使用额外的 gem 或启动一个 rails 运行器任务,它在启动时很慢并且消耗大量内存。
我正在 Rails 4 开发一个应用程序,但不确定如何实现某个功能:基本上我需要实现某种 cron 作业。例如,假设我在我的应用程序中创建了一张发票。我需要该应用程序来检查发票到期日并向客户发送发票尚未支付的提醒。我想在没有用户输入的情况下实现这一点。
我怎样才能做到这一点?
我一直在考虑这个问题,并考虑使用像 whenever 这样的工具,它会经常检查数据库。
但是还有其他方法吗?更有效率的东西?
谢谢
编辑:我试图避免的低效率:
我设想的可行方式是:
- 发票已创建。选择了截止日期。此日期会自动添加到集合中(我使用的是 Mongoid,但可能与 table 相同)
- 每天(gem)或 cron 作业都会启动一个 script/method/function 来检查上述集合中的条目。如果发现到期日期在特定时间范围内(例如 3 天内到期)的条目,将启动另一个 script/method 以通知客户发票即将到期。
我担心的是,如果有数千张发票,检查所有条目并检查它们是否在特定时间范围内可能会占用大量资源。那么,有没有更好的解决方案呢?
作为 cron 的替代方案,您可以将此 gem 用于延迟作业:
https://github.com/amitree/delayed_job_recurring
Sidekiq 也有定期作业(虽然它只存在于 sidekiq pro 中):
如果你在 Heroku 上部署,你可以使用 Heroku scheduler。我已经将它用于各种任务,例如备份、分析、计数等。
对于 rails 应用程序,您可以创建一个 rake 任务以执行 运行 特定命令,然后使用调度程序定期 运行 rake 任务。
我将作业定义为正常的控制器操作并为其设置了路由。
用 render json: @records
我 return 更新记录的列表。
(此外,我不得不通过更改 application_controller.rb 中的 before 过滤器来避免通常需要的登录)。
我可以在浏览器中测试它。
我尝试对定义的路由进行 wget
(或 curl)查询
并将其放入用户 crontab (crontab -e
)
我选择这个解决方案,因为我不想使用额外的 gem 或启动一个 rails 运行器任务,它在启动时很慢并且消耗大量内存。