iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0
自我挑戰組

Ruby on Rails 新手的30個問題!系列 第 23

Day_23 active job ?

嗨!各位朋友大家好,打給後,歹嘎吼,胎尬喉,我是阿圓,一樣有請今天的one piece:

(這真的是我看得很感動的一幕 π口π )

今天來跟各位介紹一下 active job~

active job ?

若今天想將一件事丟到背景工作去做,比如說寄一封歡迎或是驗證的email給使用者,或是過一段時間清除使用者的session,像這種可以丟到後面處理的任務,我們就會用 active job 來處理。

產生 job ?

可以用產生器產生:
rails g job user_welcome_email
這樣就會在app/jobs裡產生一個user_confirm_email_job.rb
也可以直接建立檔案的方式產生,只要確認 class 是繼承自 ApplicationJob 的class。
.rb檔的內容為:

class UserWelcomeEmailJob < ApplicationJob
  queue_as :default

  def welcome(user)
    # 寄發歡迎信
  end
end

其中的queue_as,指的是這件任務的優先程度,分別有::low_priority(低),:default(預設),:urgent(高,可插隊)

以上方程式碼為例,welcome 接收一個user 物件,然後發送歡迎信,接著就可以在 Controller 中,指定成當user建立後,發送歡迎信:

class UsersController < ApplicationController
  # ...[略]...

  def create
    @user = User.new(user_params)
    if @user.save
      UserWelcomeEmailJob.welcome_later(@user)
      redirect_to @user, notice: 'User was successfully created.'
    else
      render :new
    end
  end
  # ...[略]...
end

其中

UserWelcomeEmailJob.welcome_later(@user)

就是發送一個job,丟到背景做,至於welcome_later就是等系統有空的時候在做,若有其他的設定:

# 這樣是 5 秒之後做
UserWelcomeEmailJob.set(wait: 5.seconds).welcome_later(@user)

# 這樣是「明天下午有空再做」
UserWelcomeEmailJob.set(wait_until: Date.tomorrow.noon).welcome_later(@user)

背景工作?

所以這個 job 到底是丟到哪裡工作?預設會是主機的記憶體,但如果 job 尚在排隊中,還沒有執行,主機卻被重開機,這個時候所有的 job ,就都不見了,所以一般會將 job 存放在別的地方。
而最好設定的就是Delayed Job

照頁面說明安裝後,他會建立一個存放 job 的資料表,裡面記錄了 job 的優先權、失效時間...等等等(請參考下圖),這樣就不怕重開機的時候 job 不見了。

除了rails db:migrate也別忘了去app/configs/application.rb
加上:

module MyBlog
  class Application < Rails::Application
    config.active_job.queue_adapter = :delayed_job
  end
end

將 job 指定給delayed_job透過資料表來存放!
以上就是今天的內容,感謝各位看到這邊,若有任何建議,請各位不吝指教!我們明天見!


上一篇
Day_22 留言系統?
下一篇
Day_24 action cable(1) 早期推播技術 ?
系列文
Ruby on Rails 新手的30個問題!30

尚未有邦友留言

立即登入留言