<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 6.3 異步任務及郵件發送 ## 概要: 本課時講解如何使用 sidekiq 實現異步任務,以及如何使用 ActionMailer 發送郵件。 ## 知識點: 1. ActiveJob 1. sidekiq 1. ActionMailer ## 正文 ### 6.3.1 ActiveJob 在 Rails 4.2 之前,經常使用 [Delayed Job](https://github.com/collectiveidea/delayed_job),[Resque](https://github.com/resque/resque),[Sidekiq](https://github.com/mperham/sidekiq) 這三種異步服務,處理后端任務,比如郵件發送,報表計算,用戶動態等等。 這些任務具備一些特點: - 執行時間長,比如為所有關注我的用戶創建好友動態。 - 可以和前段操作分開執行,比如用戶注冊后,直接進入界面,而后端任務在稍后把歡迎郵件發出。 - 調用其他應用的 api 異步任務可以解決這些問題,但是三種常用的異步任務有各自的方法調用,Rails 4 中使用 [ActiveJob](http://guides.rubyonrails.org/active_job_basics.html) 來編寫統一的操作代碼,這樣即便后端服務更換,也不用更改業務邏輯代碼了。 ### 6.3.2 Sidekiq Sidekiq 使用 redis 儲存任務,并且一個進程可以等于20個 Resque 或 DelayedJob 進程(官網上的說法)。 [redis](https://github.com/antirez/redis) 的安裝非常簡單,下載[安裝包](http://redis.io/download),進入 src 目錄: ~~~ redis-server ~~~ 這樣一個命令就可以啟動 redis 服務了。在生產環境下,可以針對文件位置等配置,可以增加一個 redis.conf 文件,啟動時選擇: ~~~ redis-server .conf/redis.conf ~~~ 這里我做了兩個修改: ~~~ dir ./db/redis/ [1] logfile ./log/redis.log [2] # requirepass foobar ~~~ [1] 在我們的 db 下建立 redis 目錄,放置 redis 數據庫文件[2] redis 日志放入項目日志目錄中[3] 我們在開發環境下去掉密碼校驗 安裝 sidekiq 需要兩個 gem: ~~~ gem 'sidekiq' gem 'sinatra', :require => nil ~~~ 通常我們需要 sidekiq 的管理界面,來查看當前的任務隊列情況,sinatra 可以單獨啟動這個管理服務, 我們修改一下 routes: `config/routes.rb` ~~~ Rails.application.routes.draw do require 'sidekiq/web' mount Sidekiq::Web => '/sidekiq' ~~~ 我們再增加一個 sidekiq 的配置文件 `config/sidekiq.yml`,然后運行它: ~~~ sidekiq -C config/sidekiq.yml s ss sss sss ss s sss s ssss sss ____ _ _ _ _ s sssss ssss / ___|(_) __| | ___| | _(_) __ _ s sss \___ \| |/ _` |/ _ \ |/ / |/ _` | s sssss s ___) | | (_| | __/ <| | (_| | ss s s |____/|_|\__,_|\___|_|\_\_|\__, | s s s |_| s s sss sss ~~~ 這樣便啟動了 sidekiq 服務,我們用它來完成異步任務。在用 Rails 使用 sidekiq 前,需要在 `config/application.rb` 聲明一下: ~~~ config.active_job.queue_adapter = :sidekiq ~~~ ### 6.3.3 異步任務,Job 我們用 generate 來創建一個任務類: ~~~ rails generate job order_create ~~~ OrderCreateJob 用來處理訂單創建時,需要額外完成的一些操作,比如,向這個訂單的用戶發送一封 “訂單已確認” 的郵件。我們使用 after_create 這個回調,來觸發這個異步任務。 ~~~ class Order < ActiveRecord::Base .... after_create :send_create_email def send_create_email OrderCreateJob.perform_later(self) end ~~~ ~~~ class OrderCreateJob < ActiveJob::Base queue_as :default def perform(order) ... end end ~~~ ### 6.3.4 使用 ActionMailer 發送郵件 [ActionMailer](https://github.com/rails/rails/tree/master/actionmailer) 是一個郵件發送 gem,它使用了 ActionController 類和 [Mail](https://github.com/mikel/mail) 發送郵件,郵件可以使用視圖文件,也可以是 txt 郵件。它也可以接收郵件,具體可參考[手冊](http://guides.rubyonrails.org/action_mailer_basics.html#receiving-emails) 或 [文檔](https://github.com/mikel/mail#getting-emails-from-a-pop-server)。 我們來創建一個處理訂單郵件發送的控制器: ~~~ rails generate mailer OrderMailer create app/mailers/order_mailer.rb create app/mailers/application_mailer.rb invoke erb create app/views/order_mailer create app/views/layouts/mailer.text.erb create app/views/layouts/mailer.html.erb invoke rspec create spec/mailers/order_mailer_spec.rb create spec/mailers/previews/order_mailer_preview.rb ~~~ 我們為 app/mailers/order_mailer.rb 增加一個發送方法: ~~~ class OrderMailer < ApplicationMailer def confirm_email(order) @user = order.user @order = order mail(to: @user.email, subject: "您的訂單 #{@order.number} 已經確認") end end ~~~ ActionMailer 為我們創建了郵件模板和 html、text 兩種格式的郵件,我們分別制作相同的內容,具體請參照 [第六章代碼](https://github.com/liwei78/rails-practice-code/tree/master/chapter_6/shop)。如果同時存在 html 和 text 視圖,ActionMailer 會采用 Multipart 形式將他們發送出去。 進入終端來測試郵件: ~~~ order = Order.last OrderMailer.confirm_email(o).deliver_later Enqueued ActionMailer::DeliveryJob (Job ID: ...) to Sidekiq(mailers) with arguments: ... ~~~ `deliver_later` 是將郵件發送任務隊列,`deliver_now` 是將郵件立刻發送。區別在于,`deliver_later` 不會阻塞當前進程,比如我們頁面中會立刻進入下一個頁面,而 `deliver_now` 會等待郵件發送完成,才會進行下一步。 更 ActionMailer 的介紹請查看 [Action Mailer Basics](http://guides.rubyonrails.org/action_mailer_basics.html)。 回到 `OrderCreateJob`, 我們把郵件發送加入到 `perform` 方法中 ~~~ class OrderCreateJob < ActiveJob::Base queue_as :default def perform(order) OrderMailer.confirm_email(order).deliver_now end end ~~~ 因為我們已經使用異步任務,所以直接使用 deliver_now 發送郵件了。 更多 ActionMailer 的配置,在 [這里](http://guides.rubyonrails.org/configuring.html#configuring-action-mailer) 有詳細的介紹。 sidekiq 可以完成其他異步的業務邏輯,比如確認訂單后的積分計算,向關注我的好友發送動態等。因為我們在 routes 中增加了 sidekiq 的管理界面地址,所以訪問 [http://localhost:3000/sidekiq](http://localhost:3000/sidekiq) 可以查看當前任務執行情況。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看