Resque工作者默默失败,没有日志或调试信息

3
我有一段代码,其中运行了一个方法,我已将该方法放在self.perform中,如下所示。
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}

有什么办法可以克服这个问题吗?
2个回答

4
  1. 你是否检查了resque-web面板以查看失败的作业是什么?
  2. 确保在任何更改后重新启动工作者。
  3. 如果你在日志中没有看到“hello”(特别是log/worker.log或其他地方),那么这个函数就是没有被执行。
  4. bundle exec rake resque:work QUEUE='*' 应该是 bundle exec rake resque:work QUEUE=*,以防你真的引用了通配符。

resque-web面板没有显示任何失败的作业,我只看到一个工作程序在运行,但是没有输出或者日志里面什么都没有。当我尝试使用'bundle exec rake resque:work QUEUE=*'时,它会抛出错误,如下所示:**rake aborted! undefined method `map' for nil:NilClass **。 - Mansoor Elahi
1
没错!所以你的程序工作者实际上并没有启动。你需要找到它试图.map的nil对象。 - TomDunning
是的,但如何确定错误的来源?当不使用self.perform方法或不使用resque时,StartWorker类运行良好并产生所需的输出。 - Mansoor Elahi
bundle exec rake resque:work QUEUE=* --trace。--trace 可以添加到任何 rake 调用中。 - TomDunning
2
我找到了解决方案,实际上是由于Rails的约定优于配置,环境根本没有加载该类,所以我需要将文件名更改为lib/jobs下存在该类的start_worker.rb。我原本认为只需在application.rb中加载目录就足够了,但命名也起着巨大作用。谢谢! - Mansoor Elahi
3
对于其他寻求类似问题帮助的人,我遗忘了在 /lib/tasks/resque.rake中加载 Rails 环境: task "resque:setup" => :environment如果 Resque 找不到 worker 类,它会“默默”失败——错误计数会增加,但您不会得到进一步的错误信息。我解决问题的方式对其他人也可能有用——在运行 rake resque:work 任务时添加 VVERBOSE=true,例如: bundle exec rake resque:work QUEUE='*' VVERBOSE=true。是的,这里的 VVERBOSE 是非常详细的调试日志。 - Jeremy Burton

0

适用于我:

Resque::Scheduler.configure do |c|
  c.verbose = Rails.env.development? # or just true
end

Ruby: 3.0.3, Resque:2.2.0, Resque-Scheduler:4.5.0, Rails:6.1.4.4


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接