我有一个resque worker,它在运行bash命令后立即停止所有处理。这是我的工作人员:
class ProductJsonSaver
@queue = :products
def self.perform(id)
product = Product.find(id)
json = `phantomjs #{Rails.root}/lib/product_scrape.js`
product_json = JSON.parse(json)
p "Procesing is done"
p "Product JSON: #{product_json}"
product.update_attributes({:processed => true})
end
end
如果我跑
Resque.enqueue(ProductJsonSaver, 1)
我可以看到worker运行bash命令,我看到了bash命令的输出,但之后没有看到print语句没有产品的处理属性更新。 resque-web也不会将进程显示为失败。实际上,只需从rails控制台运行ProductJsonSaver.perform(1)
即可。
这是Resque的错误吗?
坚果&螺栓:Rails 3.2.11,OSX,ruby-1.9.3,resque 1.23.0
已编辑代码,以使问题更加清晰。
答案 0 :(得分:1)
原始代码是实际保存数据还是只是正确地放置“处理已完成”字符串?
你的专栏:
json = `cat #{Rails.root}/data/#{id}.json`
实际上并没有做任何事情。就像在最后一行中一样,你只是传递了你在第一行中获取的产品。另外,为什么要在最后一行设置一个变量,而不是允许从你在Product上调用的类方法中自然返回。
你也应该像这样阅读文件......
# in top of class
require 'file'
# in resque process method
File.open("#{Rails.root}/data/#{@id}.json", 'r') {|f| f.read}
或者通过将其包装在
中自动将其解析为JSON对象 # in top of class
require 'json'
# in resque process method
JSON.parse(File.open("#{Rails.root}/data/#{@id}.json", 'r') {|f| f.read})
希望这有帮助!
答案 1 :(得分:0)
抱歉是误报。也许这有助于其他人。我有较旧的resque工作者没有退出,但有一个较旧的代码库运行。因此,每次我排队工作时,年长的工人都会接受并开始工作。
$ ps -ef | grep [r] esque
并杀死-9来救援!