1

Devise::Mailer を使用して一度に複数のメールを送信しようとしています。Devise Async を使用して、これらのメールをまとめて送信することでシステム全体の速度を低下させるのではなく、これらのメールをキューに入れたいと考えています (これにより、アプリが約 20 秒遅延する可能性があります)。主な問題は、devise_async gem が sidekiq とまったく通信していないように見えることです (sidekiq ログには何も表示されません)。

掘り下げた後、私が持っているものとdevise_async wikiにあるものとの主な違いは、devise_async.rbファイルにパラメーターが欠落していたことです(残念ながら、これでも問題は解決しません)。

編集

おそらく問題は、私が sidekiq ワーカーを持っていないことかもしれませんが、devise_async のドキュメントではこれについて触れていません。UserMailer をトリガーする sidekiq ワーカーをトリガーする必要がありますか? UserMailer 自体がワーカーであるという印象を受けました。

devise_async.rb

Devise::Async.setup do |config|
  config.enabled = true
  config.backend = :sidekiq
  config.queue   = :default
end

sidekiq.yml

:verbose: true
:concurrency: 25
production:
  :concurrency: 20
:queues:
  - [mailer, 5]
  - [default, 5]

devise.rb

config.mailer_sender = 'test@gmail.com'
config.mailer = 'UserMailer'

user.rb

after_create :send_email_notification

devise :database_authenticatable, :registerable, :timeoutable,
         :recoverable, :rememberable, :trackable, :validatable, :async

def send_email_notification
        user = User.find(id)
        team = Team.find(user.team_id)

        team.memberships.each do |membership|         
            UserMailer.notification_email(user, team, membership).deliver_later
        end
    end

user_mailer.rb

class UserMailer < Devise::Mailer
    default from: "test@gmail.com"

    def notification_email(current_user, team, membership)
        @user = current_user
        if ENV["ENABLE_EMAIL"] == "YES"         
            if membership.user_id != current_user.id
                subject = 'TEST'
                @recipient_name = membership.user.userName.titleize
                mail(to: membership.user.email, subject: subject)
            end     
        end

    end
end
4

2 に答える 2

1

を使用して構成したカスタム キューを DeviseAsync が尊重しないという同様の問題が発生しましたDevise::Async.queue = :some_queue

次のことを試してください。

  1. config.queue = :defaultdevise_async.rb から削除します。(DeviseAsync は:mailer既定でキューを使用します)。
  2. 走るsidekiq -q default -q mailer

sidekiq ワーカーは、:mailerキュー内の他のジョブに加えて、キューからの Devise メールを処理し:defaultます。

于 2015-03-13T19:17:13.853 に答える
0

私はdevise_asyncで同様の問題を処理していました。

私が見つけた解決策は次のとおりです。

ユーザー.rb

UserMailer.notification_email(user, team, membership).deliver_later

私は次のものに置き換えました:

UserMailer.delay.notification_email(user, team, membership)

だから、私はあなたが実行できると信じています:bundle exec sidekiq

お役に立てば幸いです

于 2016-08-02T11:23:17.557 に答える