What is Active Job?
什麼是Active Job?
網站上有些工作比較耗時,在等待的過程中,使用者不知道怎麼回事,體驗就會比較不好。通常碰到這種情況我們會將這種工作先存起來,繼續往下執行下面的步驟,等主機有空檔時再來處理這些事情,也就是非同步處理的概念。
Rails內建的Active Job就是來幫我們處理這些事情的。
舉要給使用者註冊後的通知信,我們可以用下面的指令來生成
rails g job user_notice_email
在app/jobs
下面就會產生這個檔案,這個類別繼承自ApplicationJob
class UserNoticeEmailJob < ApplicationJob
queue_as :default
def perform(*args)
# Do something later
end
end
queue_as
是表示這事情急不急,根據程度也可以改成:urgent
、:low_priority
等等。
perform
這邊就可以寫下我們要做的事,參數可以根據我們的需求做調整
還可以根據我們想要的時間來執行
# 希望這項工作可以盡快被執行
UserNoticeEmailJob.perform_later(user)
# 明天中午再執行
UserNoticeEmailJob.set(wait_until: Date.tomorrow.noon).perform_later(guest)
# 一個禮拜後再執行
UserNoticeEmailJob.set(wait: 1.week).perform_later(guest)
另外還有個小問題是Active Job預設是將這些排程工作存在記憶體當中,這樣萬一重開機或是機器出現什麼狀況,排程的工作就會消失,所以通常還會再搭配其他的套件,將排程的工作存在其他地方,常見的有Delayed::Job
和Sidekiq
Active Job 讓我們可以製造背景工作且對他們進行排程,通常是使用在某些耗時較久或沒必較馬上被執行的任務上,例如寄出通知信。由於預設是存在記憶體,通常還會再搭配其他的套件,將排程的工作存在其他地方,常見的有Delayed::Job
和Sidekiq
。
2.53 Ruby on Rails Interview Questions and Answers
3.為你自己學 Ruby on Rails - 背景工作及工作排程