11

我目前正在构建一个 Rails 平台,并且我已经使用设计进行身份验证,现在想使用 sidekiq 将默认设计电子邮件移动到后台进程中。我为此使用了 devise-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 队列中传递,但工作人员从不执行发送电子邮件。我也看过devise async not working with sidekiq,他似乎也有同样的问题。但我认为我对 hostname 命令没有问题。

对这个问题有什么想法吗?

4

3 回答 3

19

答案相当简单。你只需要告诉 sidekiq 使用mailer队列,通过使用bundle exec sidekiq -q mailer. 这样,邮件队列将被处理,没有选项 sidekiq 将仅依赖default队列。

于 2012-11-21T09:21:59.487 回答
0

在 2019 年,由于device-async不是最新的,并且如果您有 ActiveJob 和 sidekiq 设置,请在此处完成文档。最简单的解决方案是覆盖与事务邮件相关的设备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's `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
于 2019-05-09T18:13:47.513 回答
0

Devise 现在支持此功能 https://github.com/heartcombo/devise#activejob-integration

class User < ApplicationRecord

  devise ...

  # Override devise: send emails in the background
  def send_devise_notification(notification, *args)
    devise_mailer.send(notification, self, *args).deliver_later
  end

end
于 2021-06-11T04:45:39.653 回答