对 Rails 有点陌生,所以请配合我。我现在正在做的是后台处理一些使用 Resque 的 Ruby 代码。为了启动 Rescque rake 任务,我一直在使用(在 heroku 上),我有一个 resque.rake 文件,其中包含推荐的代码附加到 heroku 的神奇(或奇怪)线程架构中:
require "resque/tasks"
require 'resque_scheduler/tasks'
task "resque:setup" => :environment do
ENV['QUEUE'] = '*'
end
desc "Alias for resque:work (To run workers on Heroku)"
task "jobs:work" => "resque:work"
因为我需要访问 Rails 代码,所以我参考 :environment。如果我在 heroku 的背景中设置了至少 1 个工人测功机,我的 Resque 做得很好,被清除了,一切都很开心。直到我尝试自动化的东西......
所以我想改进代码并每隔一分钟左右自动用相关任务填充队列。这样做(不使用 cron,因为 heroku 不适合 cron),我声明了一个名为 task_scheduler.rb 的初始化程序,它使用 Rufus 调度程序来运行任务:
scheduler = Rufus::Scheduler.start_new
scheduler.in '5s' do
autoprocessor_method
end
scheduler.every '1m' do
autoprocessor_method
end
事情似乎在一段时间内工作得很棒……然后 rake 过程就莫名其妙地停止从队列中提取。队列变得越来越大。即使我有多个工人测功机在运行,它们最终都会感到疲倦并停止处理队列。我不确定我做错了什么,但我怀疑我的 rake 任务中对 Rails 环境的引用导致 task_scheduler.rb 代码再次运行,从而导致重复调度。我想知道如果有人知道如何解决这个问题,我也很好奇这是否是 rake 任务停止工作的原因。
谢谢