0

bash コマンドを実行するとすぐにすべての処理を停止する resque ワーカーがあります。これが私の労働者です:

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 コマンドの出力は表示されますが、その後の print ステートメントは表示されず、製品の処理された属性は更新されません。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 に答える