2013-04-03 21 views
12

私はこのSidekiq労働者を持っている:Sidekiqは引数をperformメソッドにどのように渡しますか?

class DealNoteWorker 
    include Sidekiq::Worker 
    sidekiq_options queue: :email 

    def perform(options = {}) 
    if options[:type] == "deal_watch_mailer" 
     deal_watchers = DealWatcher.where("deal_id = ?", options[:deal_id]) 

     deal_note = DealNote.find(options[:deal_note_id]) 

     current_user = User.find(options[:current_user_id]) 

     deal_watchers.each do |deal_watcher| 
     unless deal_watcher.user_id == options[:current_user_id] 
      # Tell the DealWatchMailer to send emails to ALL watchers advising of change to deal 
      if deal_watcher.user.active 
      DealWatchMailer.deal_watch_email(deal_watcher, nil, deal_note, current_user, options[:url]).deliver 
      end 
     end 
     end 
    elsif options[:type] == "deal_note_mailer" 
     options[:user_ids].each do |id| 
     if DealWatcher.where("deal_id = ? and user_id =?", options[:deal_id], id).count == 0 
      deal_note = Deal.find(options[:deal_note_id]) 
      user = User.find_by_id(id) 
      DealNoteMailer.deal_note_email(deal_note, user, options[:url]).deliver 
     end 
     end 
    end 
    end 
end 

は私がperform_asyncメソッドにハッシュを渡すが、私はperformメソッドに転送パラメータがperform_asyncに渡されたものと同じタイプではないと思います。私はユーザlogger.infopに問題をデバッグしようとしましたが、何も出力されませんでした...

ジョブは電子メールキューに追加されますが、決して処理されません。

class DealNoteWorker 
    include Sidekiq::Worker 

    def perform(deal_id, deal_note_id, current_user_id, url) 
    deal_watchers = DealWatcher.where("deal_id = ?", deal_id) 

    deal_note = DealNote.find(deal_note_id) 

    current_user = User.find(current_user_id) 

    deal_watchers.each do |deal_watcher| 
     unless deal_watcher.user_id == current_user_id 
     # Tell the DealWatchMailer to send emails to ALL watchers advising of change to deal 
     if deal_watcher.user.active 
      DealWatchMailer.deal_watch_email(deal_watcher, nil, deal_note, current_user, url).deliver 
     end 
     end 
    end 
    end 
end 

:私も、私は以下の労働者が働くことを事実として知っている...しかし、何もいずれかの出力なかった(第一の方法の行に)

perform方法で例外を発生させることを試みました問題はハッシュパラメータ(オプション)にあります。私は何を間違えていますか?

+0

あなたは必ずサイドキックワーカーを始めましたか?別の端末で 'bundle execkiq'を実行してください。また、 'email'というキューを使用しているので、' sidekiq -q email'を実行する必要があります。 –

+0

ええ、それは問題でした。私は電子メールキューでsidekiqを開始する必要がありました。そこでsidekiq.yml設定ファイルにキューのリストを追加し、問題を修正しました。私はそれを受け入れることができるように答えとしてあなたのコメントを追加できますか? –

答えて

1

電子メールと呼ばれるキューを使用しているので、sidekiq -q emailを実行する必要があります。

19

Sidekiq documentationから:文字列、整数、浮動小数点、ブール値、ヌル、配列とハッシュ:あなたはperform_asyncに渡す

引数は、単純な JSONデータ型で構成されなければなりません。 SidekiqクライアントAPIは、JSON.dumpを使用してデータをRedisに送信します。 Sidekiqサーバーは、JSONデータをRedisから取得し、JSON.loadを使用して データをRubyタイプに変換してから、performメソッドに渡します。 シンボルや複雑なRubyオブジェクト(日付や時刻など)を として渡さないでください。ダンプ/ロード往復で正常に機能しません。

は、コンソール上でこれを見ることができます:

> options = { :a => 'b' } 
> how_sidekiq_stores_the_options = JSON.dump(options) 
> how_sidekiq_loads_the_options = JSON.load(how_sidekiq_stores_the_options) 
> how_sidekiq_stores_the_options == how_sidekiq_loads_the_options 
    false 

あなたoptionsハッシュのキーとしてシンボルを使用しているように見えます。文字列キーに切り替えると機能します。

+0

また、ハッシュが問題になることがあります。 JSONとしてこれらを渡すと、私にとって間違った引数の間違いが解決されました。 – ericpeters0n

+0

私は似たようなものを持っています。ワーカーが最初に実行されるとき、私のコードが発生する例外を取得し、次の再試行で引数エラーの数が間違っています。 – holaSenor

関連する問題