我有這個Sidekiq工人: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.info
和p
來調試我的問題,但沒有得到輸出...
問題是作業被添加到電子郵件隊列,但從來沒有得到處理。我甚至試圖提高在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
所以問題在於散列參數(選項)。請問我做錯了什麼?
你確定你已經開始sidekiq工人?在另一個終端中運行'bundle exec sidekiq'。另外,你正在使用一個名爲'email'的隊列,所以你需要運行'sidekiq -q email'。 –
是的,這是問題所在。我需要用電子郵件隊列啓動sidekiq。所以我在sidekiq.yml配置文件中添加了一個隊列列表,解決了這個問題。你可以添加你的評論作爲答案,以便我可以接受它嗎? –