Фоновая рассылка через 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