Sidekiq Ошибка возврата метода восстановления задания в методе execute_asyn c - PullRequest
0 голосов
/ 21 января 2020

Я определил работу почтовой программы, используя sidekiq, как показано ниже. Проблема, с которой я здесь сталкиваюсь, заключается в том, что я определил VisitReminderWorker.perform_asyn c (cost_ids) как asyn c задание, из-за которого я не получаю сообщение об ошибке из файла worker.rb. То, что я хочу, если в рабочем файле есть ошибка, он возвращает ошибку в файл rake в методе восстановления. Любая идея, где я иду не так.

office.rake

namespace :office do
  desc "send payment reminder emails"
  task send_payment_reminder: :environment do
    VisitReminderRun.create(status: :processing)
    reminder_run = VisitReminderRun.last
    visit_reminder_job_status = true
    Office.all.each do |office|      
      expense_ids = []
      office.issues.where("issues.amount > 0").each do |issue|
        expense = issue.expenses.order(:date, :id).last
        expense_ids << expense.id if expense.date < VisitReminderRun.last.created_at 
      end
      begin      
        VisitReminderWorker.perform_async(expense_ids)
      rescue StandardError => e
        visit_reminder_job_status = false
      end
    end
    if visit_reminder_job_status == false
      reminder_run.update(status: :failed) 
    else 
      reminder_run.update(status: :successful) 
    end
  end
end 

visit_reminder_worker.rb

class VisitReminderWorker
  include Sidekiq::Worker
  def perform(expense_ids)
    begin
      VisitReminderMailer.visit_reminder_letter(expense_ids).deliver_now
    rescue StandardError => e
      return e
    end
  end
end

1 Ответ

0 голосов
/ 21 января 2020

Вы не можете сделать это, потому что метод perform_async не выполняет код вашего работника, а только планирует его на потом. Вы можете либо выполнить его немедленно, выполнив VisitReminderWorker.new.perform(expense_ids) и поймать ошибку, либо вы можете обрабатывать исключения асинхронно - что необходимо, потому что если ваш код выполняется асинхронно, то, очевидно, ваши исключения также будут асинхронными.

Один из способов использовать какой-либо трекер исключений (например, Rollbar или Stackdriver ). Другой способ - отслеживать ваши Sidekiq::RetrySet и Sidekiq::DeadSet, например, используя веб-интерфейс sidekiq .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...