0

我有一个 resque 工作人员,它在运行 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)

我可以看到工作人员运行 bash 命令,我看到了 bash 命令的输出,但之后看不到打印语句,产品的已处理属性不会更新。resque-web 也没有将进程显示为失败。事实上,只需ProductJsonSaver.perform(1)从 rails 控制台运行即可。

这是 Resque 的错误吗?

基本要素:Rails 3.2.11、OSX、ruby-1.9.3、resque 1.23.0

编辑代码使问题更清晰。

4

2 回答 2

1

该原始代码实际上是在保存数据还是只是正确地放置了您的“处理完成”字符串?

您的线路:

json = `cat #{Rails.root}/data/#{id}.json`

是不是真的什么都没做。与最后一行一样,您只是将您在第一行中获取的 Product 传递给它。另外,为什么要在最后一行设置一个变量,而不是允许从您在 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})

希望这会有所帮助!

于 2013-01-16T01:16:42.153 回答
0

很抱歉误报。也许这对其他人有帮助。我有较旧的 resque 工作人员没有退出,但运行的是较旧的代码库。因此,每次我排队工作时,都会有一位年长的工人接受并运行。

$ ps -ef | grep [r]esque

并杀死 -9 进行救援!

于 2013-01-16T04:54:37.770 回答