Mailer用delay就失敗


#1

各位大大好,
小弟目前寫了一個交易完成的寄信
如下

class OrderMailer < ApplicationMailer
  def success data = {}
    @order   = Order.find_by(number: data[:id])

    mail(to: @order.email, subject: "訂單成功下單")
  end
end

然後呼叫的時候若使用

OrderMailer.success(id: @order.number).deliver

這樣就能正常寄信,也能正常收到

但是若使用delay的話,就會出現nil class的錯誤

OrderMailer.delay.success(id: @order.number)

後來用Sidekiq檢查,參數也的卻有傳進去,但會出現這個錯誤
ActionView::Template::Error: undefined method `name’ for nil:NilClass
代表在@order = Order.find_by(number: data[:id])
的搜尋是空值

想請問大大為什麼只要使用Delay,會出現這個問題呢?


#2

為何不是用 … deliver_later ? 你單純要做測試?

你可以去比較一下 deliver vs deliver_later vs perform_later 的分別?

( 可能單純我沒用過 delay 唄 |||| … )

還是你單純上了這個 gem ?

Orz" 如果你單純是想要 background job 系列,建議你用我說的那些 sidekiq 的語法,不然就建議你另外寫 process 完成,而不是用這種 gem … 否則很多時候容易被搞死唄|||


#3

謝謝JC大大
目前專案的GEM只有gem 'sidekiq’
用JC大大說的deliver_later信件就正常寄出了,沒有出現任何Error
因為專案以前工程師寫的寄信是用delay,就沿著之前的程式碼來修改
但是發現單純傳遞參數沒有問題,但只要在Model查詢物件就會出錯
後來晚上測試發現我目前在寫的訂單寄信功能,用delay雖然一開始會出現錯誤訊息
但是約5-10分鐘,Sidekiq的貯列就會Retry,就會成功寄信…
還不知道是什麼問題…

目前了解deliver 跟 deliver_later…但用perform_later測試…目前還不太了解其中的差異
能否請JC大大說明呢


#4

deliver_later vs perform_later

這算歷史共業唄哈哈,前者是 ActiveMailer,後者是 ActiveJob,兩者其實都是 delay job 系列,ActiveMailer 先出現,因為都是寄信所以是 “deliver”,後者出現就啥都可以做,但沒辦法定時執行之類的,所以類似 cron job 系列也都不適合這兩個就是