17

私はこの Sidekiq ワーカーを持っています:

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と思います。ユーザーに問題をデバッグしようとしましたが、何も出力されません...performperform_asynclogger.infop

問題は、ジョブが電子メール キューに追加されても処理されないことです。performメソッドで(メソッドの最初の行で)例外を発生させようとしましたが、何も出力されませんでした...

私は、次のワーカーが機能することを事実として知っています。

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

したがって、問題はハッシュ パラメーター (オプション) にあります。私は何を間違っていますか?

4

3 に答える 3

30

Sidekiqのドキュメントから:

perform_async に渡す引数は、単純な JSON データ型 (string、integer、float、boolean、null、array、および hash) で構成する必要があります。Sidekiq クライアント API は、JSON.dump を使用してデータを Redis に送信します。Sidekiq サーバーは、その JSON データを Redis からプルし、JSON.load を使用してデータを Ruby 型に変換し直して、実行メソッドに渡します。シンボルや複雑な Ruby オブジェクト (Date や Time など) を渡さないでください。これらは、ダンプとロードの往復を正しく処理できません。

これはコンソールで確認できます。

> 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ハッシュのキーとしてシンボルを使用しているようです。文字列キーに切り替えると、うまくいくはずです。

于 2014-03-28T05:30:51.450 に答える
2

email というキューを使用しているため、sidekiq -q email を実行する必要があります。

于 2013-04-05T02:07:35.453 に答える