Resque任务总是失败 - 未初始化的作业常量?

时间:2015-05-30 07:09:12

标签: ruby heroku background sinatra resque

我之前尝试过使用Resque,并且遇到了彻底的失败。我再次使用相同的结果再次访问它......

resque.rake

require "resque/tasks"

task "resque:setup" => :environment

test.rb

require 'resque'

class FileWorker
  @queue = :save_to_file

  def self.perform(str)
    File.open('./' + Time.now.to_s + '.txt', 'w+') do |f|
      f << "test 123"
    end
  end
end

Resque.enqueue(FileWorker, "12345567".split('').shuffle.join)

Gemfile

gem 'resque'
gem 'rake'

似乎自己运行test.rb成功排队:

enter image description here

但是,在同一文件夹中运行rake resque:work QUEUE='*'会产生警告

  

警告:现在不推荐使用这种信号处理方式。请   见http://hone.heroku.com/resque/2012/08/21/resque-signals.html   更多信息。

以及添加到&#34;失败的任务&#34;排队的原因如下:"exception":"NameError","error":"uninitialized constant FileWorker"

我如何让它工作?看起来很明显,但有很多关于Resque的教程跨越多年 - 有些痛苦地过时了,没有一个解释如何管理工人,所以他们不会失败。

提前致谢。

1 个答案:

答案 0 :(得分:8)

当您使用Resque排队任务时,Redis上存储的内容只是作业类的名称(作为字符串)以及JSON对象中的参数(再次作为字符串)。

当一个worker然后尝试执行该任务时,它需要能够创建一个job类的实例。它是通过const_getconst_missing来实现的。这是您看到的错误发生的地方,因为工作人员没有可用的FileWorker定义。

错误与您尝试在irb中获取未知常量的错误相同:

> Object.const_missing "FileWorker"
NameError: uninitialized constant FileWorker

解决方案是确保您的员工可以使用FileWorker的定义。最简单的方法是只需要test.rb(或Rakefile)中的resque.rake。在您的代码中,这将涉及向队列添加另一个任务,因此您可能希望将FileWorker代码移动到其自己的文件,rake文件和代码排队作业都需要它。

test.rb

require 'resque'
require './file_worker'

Resque.enqueue(FileWorker, "12345567".split('').shuffle.join)

Rakefile(注意:environment任务只有在使用Rails时才有意义,否则会给出错误):

require "resque/tasks"
require "./file_worker"

file_worker.rb

class FileWorker
  @queue = :save_to_file

  def self.perform(str)
    File.open('./' + Time.now.to_s + '.txt', 'w+') do |f|
      f << "test 123"
    end
  end
end

现在,工作人员将能够创建FileWorker的实例来完成任务。

page linked to in the message中给出了避免信号警告的方法。只需在调用rake时设置环境变量TERM_CHILD

$ rake resque:work QUEUE='*' TERM_CHILD=1