我有一段代码,其中运行了一个方法,我已将该方法放在self.perform中,如下所示。
如果我注释掉 `def self.perform` 和 `end`,然后运行这个文件,它会正确地显示所需的结果,但是当我尝试取消注释并将其作为后台任务运行时,它会在resque面板中静默失败,没有任何输出在命令提示符中。我是从我的resque_schedule.yml中的resque-scheduler队列中排队执行的。
有什么办法可以克服这个问题吗?
class StartWorker
@queue = :worker
def self.perform
puts "hello"
Parser.find_all_by_class_name("Parser").first.sites.each do |s|
site = Site.find(s.id)
parser = Parser.new(site)
parser.run
end
end
end
如果我注释掉 `def self.perform` 和 `end`,然后运行这个文件,它会正确地显示所需的结果,但是当我尝试取消注释并将其作为后台任务运行时,它会在resque面板中静默失败,没有任何输出在命令提示符中。我是从我的resque_schedule.yml中的resque-scheduler队列中排队执行的。
start_worker:
cron: "55 6 * * *"
class: StartWorker
queue: worker
args:
description: "This job starts all the worker jobs"
我尝试在def self.perform方法内添加一些简单的puts语句来检查控制流是否经过该方法,但似乎控制甚至没有通过self.perform方法
我还试图加载rails环境并在其中要求resque,但没有用。在进行任何更改之前,我运行了bundle exec rake resque: work QUEUE ='*'脚本。
我在rails控制台中尝试了Resque.info,显示如下:
{:working=>0, :queues=>1, :failed=>1, :environment=>"development", :servers=>["redis://localhost:6379/0"], :pending=>0, :processed=>1, :workers=>1}
有什么办法可以克服这个问题吗?
bundle exec rake resque:work QUEUE=* --trace
。--trace 可以添加到任何 rake 调用中。 - TomDunningtask "resque:setup" => :environment
如果 Resque 找不到 worker 类,它会“默默”失败——错误计数会增加,但您不会得到进一步的错误信息。我解决问题的方式对其他人也可能有用——在运行 rake resque:work 任务时添加VVERBOSE=true
,例如:bundle exec rake resque:work QUEUE='*' VVERBOSE=true
。是的,这里的 VVERBOSE 是非常详细的调试日志。 - Jeremy Burton