我之前尝试过使用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
成功排队:
但是,在同一文件夹中运行rake resque:work QUEUE='*'
会产生警告
警告:现在不推荐使用这种信号处理方式。请 见http://hone.heroku.com/resque/2012/08/21/resque-signals.html 更多信息。
以及添加到&#34;失败的任务&#34;排队的原因如下:"exception":"NameError","error":"uninitialized constant FileWorker"
我如何让它工作?看起来很明显,但有很多关于Resque的教程跨越多年 - 有些痛苦地过时了,没有一个解释如何管理工人,所以他们不会失败。
提前致谢。
答案 0 :(得分:8)
当您使用Resque排队任务时,Redis上存储的内容只是作业类的名称(作为字符串)以及JSON对象中的参数(再次作为字符串)。
当一个worker然后尝试执行该任务时,它需要能够创建一个job类的实例。它是通过const_get
和const_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