dsp*_*099 2 ruby background heroku sinatra resque
我之前尝试过使用Resque并遇到了彻底的失败.我正在重新审视它,结果相同......
resque.rake:
require "resque/tasks"
task "resque:setup" => :environment
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
Gemfile:
gem 'resque'
gem 'rake'
Run Code Online (Sandbox Code Playgroud)
看起来像test.rb自己运行成功地排队工作:

但是,rake resque:work QUEUE='*'在同一文件夹中运行会导致警告,
警告:现在不推荐使用这种信号处理方式.有关详细信息,请参阅http://hone.heroku.com/resque/2012/08/21/resque-signals.html.
以及添加到"失败"队列的任务以及以下原因: "exception":"NameError","error":"uninitialized constant FileWorker"
我如何让它工作?看起来很明显,但有很多关于Resque的教程跨越多年 - 有些痛苦地过时了,没有一个解释如何运行工人,所以他们不会失败.
提前致谢.
当您使用Resque排队任务时,Redis上存储的内容只是作业类的名称(作为字符串)以及JSON对象中的参数(再次作为字符串).
当工作人员尝试执行任务时,它需要能够创建作业类的实例.它通过使用const_get和来做到这一点const_missing.这是您看到的错误发生的地方,因为工作人员没有FileWorker可用的定义.
该错误与您尝试获取未知常量的错误相同irb:
> Object.const_missing "FileWorker"
NameError: uninitialized constant FileWorker
Run Code Online (Sandbox Code Playgroud)
解决方案是确保FileWorker您的工作人员可以使用定义.最简单的方法是test.rb从你的Rakefile(或resque.rake)中获取.在您的代码中,这将涉及向队列添加另一个任务,因此您可能希望将FileWorker代码移动到其自己的文件中,rake文件和代码排队作业都需要它.
test.rb:
require 'resque'
require './file_worker'
Resque.enqueue(FileWorker, "12345567".split('').shuffle.join)
Run Code Online (Sandbox Code Playgroud)
Rakefile(注意,:environment如果您使用Rails,该任务才有意义,否则会给出错误):
require "resque/tasks"
require "./file_worker"
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
现在,工作人员将能够创建FileWorker完成任务的实例.
在消息中链接的页面中给出了避免信号警告的方法.只需TERM_CHILD在调用rake时设置环境变量:
$ rake resque:work QUEUE='*' TERM_CHILD=1
Run Code Online (Sandbox Code Playgroud)