2013-04-03 4 views
12

У меня есть этот 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 

Таким образом, проблема заключается в хэш-параметре (опции). Что я делаю неправильно?

+0

Вы уверены, что начали работу sidekiq? Запустите 'bundle exec sidekiq' в другом терминале. Кроме того, вы используете очередь под названием 'email', поэтому вам нужно запустить' sidekiq -q email'. –

+0

Да, это была проблема. Мне нужно было запустить sidekiq с электронной почтой. Поэтому я добавил список очередей в файле конфигурации sidekiq.yml и устранил проблему. Не могли бы вы добавить свой комментарий в качестве ответа, чтобы я мог его принять? –

ответ

1

Вы используете очередь, называемую электронной почтой, поэтому вам нужно запустить sidekiq -q email.

19

От Sidekiq documentation:

аргументов вы передаете perform_async должен состоять из простых JSON типов данных: строка, целое, вещественные, логические, NULL, массив и хэш. API-интерфейс клиента Sidekiq использует JSON.dump для отправки данных в Redis. Сервер Sidekiq извлекает данные JSON из Redis и использует JSON.load для , чтобы преобразовать данные обратно в типы Ruby, чтобы перейти к вашему методу выполнения. Не пропускайте символы или сложные объекты Ruby (например, Date or 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 хэша. Если вы переключитесь на строковые ключи, он должен работать.

+0

Также обратите внимание, что хэш может быть проблематичным. Передавая их, как JSON решил загадочную ошибку «неправильное количество аргументов» для меня. – ericpeters0n

+0

У меня что-то похожее. При первом запуске работника я получаю исключение, которое повышает мой код, а следующая попытка - ошибочное число ошибок аргумента. – holaSenor

Смежные вопросы