2016-08-01 43 views
1

我正在使用Sidekiq和Mandrill在後臺發送電子郵件的Rails應用程序。 在我的應用程序中,我有2個隊列,一個用於與我的服務進行用戶交互(不相關),另一個是郵件隊列。 郵寄者隊列由2個郵寄者使用:一個用於管理用戶配置文件,另一個用於與我們的服務進行交互(不相關)。Sidekiq工作計劃,沒有運行,只是消失

今天我注意到,除了由Devise發送的確認電子郵件之外,用戶幾天都沒有收到電子郵件。

另一個隊列工作完美,沒有任何問題。 (所以也許Sidekiq配置不是問題)。

例如讓我們通知了成功簡介更新用戶的UserMailer:

user_mailer.rb

def update_user(user) 
    @user = user 
    mail(:to => user.email) 
end 

user_profile_controller.rb

def update_resource(user) 
    user.save 
    UserMailer.update_user(user).deliver_later(wait: 1.minute) 
    end 

當我試圖測試這個函數使用deliver_now而不是deliver_later它工作並且發送了郵件(所以與。的連接Mandrill正在工作)。 當我按照原樣測試此函數時,該作業正被添加到郵件程序隊列中。當發送電子郵件時,它只是從隊列中消失而不發送電子郵件,也不會在日誌中留下任何異常。

我可以看到它出現在Sidekiq Web UI中,然後消失。

我想確認電子郵件是唯一一個被髮送,因爲它沒有延遲,但我不知道爲什麼這是發生。

在我的分期環境中,一切都很好。不同之處在於它使用的是郵件陷阱,並沒有生產那麼多的工作。

一些代碼,可能是相關的:

production.rb

config.action_mailer.delivery_method = :smtp 
    config.action_mailer.smtp_settings = { 
     :user_name => 'xxx', 
     :password => Rails.application.secrets.smtp_password, 
     :address => 'smtp.mandrillapp.com', 
     :domain => config.app_domain, 
     :port => 'xxx', 
     :authentication => :login 
    } 
... 
config.action_mailer.default_url_options = { :host => config.app_domain, :protocol => 'https' } 
    config.action_mailer.perform_deliveries = true 
    config.action_mailer.raise_delivery_errors = false 

application.rb中

config.active_job.queue_adapter = :sidekiq 

通過這些鏈接走着走着,沒有任何解決辦法:

http://guides.rubyonrails.org/active_job_basics.html http://api.rubyonrails.org/classes/ActionMailer/Base.html

還沒有發現任何與我的問題相關的其他鏈接。

  • 嘗試重新部署
  • 試圖重新啓動Sidekiq
  • 試圖重新啓動Redis的
  • 試圖重新啓動服務器本身
  • 試圖從控制檯發送電子郵件 - 成功
  • 嘗試發送電子郵件deliver_later(等待:1分鐘) - 不成功
+0

今天我遇到類似的問題,我不確定這是否有幫助但你有沒有試過用這個命令啓動你的服務器? 'bundle exec sidekiq -q default -q mailers'https://github.com/mperham/sidekiq/wiki/Active-Job#action-mailer – sirramongabriel

+0

@sirramongabriel yep – MaxDBN

+0

你知道這個問題的根源嗎?我遇到了一個非常類似的問題。 –

回答

0

我是s使用它與服務器上的內存不足有關。當我增加了服務器上的內存和postgres上的max_connections參數時,該隊列中應該發送的所有電子郵件都立即交付