Фоновая рассылка через sidekiq и devise-async, очередь заполняется, но письма не обрабатываются

В настоящее время я создаю платформу rails, и я использовал средство для проверки подлинности и теперь хочу перенести созданные по умолчанию электронные письма в фоновый процесс с использованием sidekiq. Для этого я использую devine-async и сделал следующее:

Добавлен файл devise_async.rb:

#config/initializers/devise_async.rb
Devise::Async.backend = :sidekiq

Добавлена ​​команда async для модели разработки:

#user.rb
devise :database_authenticatable, :async #etc.

Версии драгоценных камней следующие:

Devise 2.1.2
Devise-async 0.4.0
Sidekiq 2.5.3

Проблема, с которой я столкнулась, заключается в том, что электронные письма передаются в очереди sidekiq, но рабочие никогда не выполняют отправку писем. Я также посмотрел на devine async, не работающий с sidekiq, и у него, похоже, была та же проблема. Но я не думаю, что у меня проблема с командой hostname.

Любые мысли по этому вопросу?

Ответ 1

Ответ довольно прост. Вам просто нужно указать sidekiq для использования очереди mailer, запустив sidekiq с помощью bundle exec sidekiq -q mailer. Таким образом, очередь почтовых отправлений будет обработана, без опции sidekiq просто будет полагаться на очередь default.

Ответ 2

В 2019 году, поскольку устройство-асинхронизация не устарела, и если у вас есть настройка ActiveJob, здесь сделана документация. Самое простое решение - переопределить ваши методы экземпляра send_devise_notification устройства, связанные с почтой транзакций, как показано здесь

class User < ApplicationRecord
  # whatever association you have here
  devise :database_authenticatable, :confirmable
  after_commit :send_pending_devise_notifications
  # whatever methods you have here

 protected
  def send_devise_notification(notification, *args)
    if new_record? || changed?
      pending_devise_notifications << [notification, args]
    else
      render_and_send_devise_message(notification, *args)
    end
  end

  private

  def send_pending_devise_notifications
    pending_devise_notifications.each do |notification, args|
      render_and_send_devise_message(notification, *args)
    end

    pending_devise_notifications.clear
  end

  def pending_devise_notifications
    @pending_devise_notifications ||= []
  end

  def render_and_send_devise_message(notification, *args)
    message = devise_mailer.send(notification, self, *args)

    # Deliver later with Active Job 'deliver_later'
    if message.respond_to?(:deliver_later)
      message.deliver_later
    # Remove once we move to Rails 4.2+ only, as 'deliver' is deprecated.
    elsif message.respond_to?(:deliver_now)
      message.deliver_now
    else
      message.deliver
    end
  end

end