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方法,但我认为传递给该perform方法的参数与传递给的参数类型不同perform_async。我尝试使用logger.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 服务器从 Redis 中提取 JSON 数据并使用 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哈希的键。如果您切换到字符串键,它应该可以工作。

于 2014-03-28T05:30:51.450 回答
2

您正在使用一个名为 email 的队列,因此您需要运行 sidekiq -q email。

于 2013-04-05T02:07:35.453 回答
0

请注意,作为符号发送的哈希键将在传输到 Sidekiq 执行时转换为字符串。

于 2022-01-28T15:09:08.817 回答