revel提供了一個框架用於脫離請求流程的執行異步任務,一般用來執行經常運行的任務、更新緩存數據或發送郵件等。 ##啟用 該框架作為一個可選的revel模塊,默認並不啟用。需要更改應用配置來啟用它: module.jobs = github.com/robfig/revel/modules/jobs 此外,為了訪問任務監控頁面,需要將下面添加至路由配置: module:jobs 這條語句將在路由配置中加入`/@jobs`地址 ##參數 一些選項告訴jobs框架在運行任務時應該具有什么樣的限制,下面是默認值: jobs.pool = 10 # 允許同時執行多少個任務 jobs.selfconcurrent = false # 允許一個任務只有在前一個實例完成后才能運行 ##啟動任務 使用`revel.OnAppStart`函數在程序開始運行時啟動一個任務,revel將在啟動服務器之前連續的運行這些任務。注意,此功能並不是用jobs模塊,但是它可以用來提交一個jobs作業而不終端服務器的啟動。 func init() { revel.OnAppStart(func() { jobs.Now(populateCache{}) }) } ##經常性的任務 任務可以被任何時間表調度,有兩個方法來表示時間表: 1、一個cron表達式 2、一個固定的時間間隔 revel使用`cron`來處理cron表達式並執行任務,這里對`cron`的格式進行了詳細的說明: https://github.com/robfig/cron/blob/master/README.md 任務通常在`revel.OnAppStart`處理器注冊,但也可以在之后的任何時間來注冊一個任務。 import ( "github.com/robfig/revel" "github.com/robfig/revel/modules/jobs/app/jobs" "time" ) type ReminderEmails struct { // 省略 } func (e ReminderEmails) Run() { // 查詢數據庫 // 發送一些郵件 } func init() { revel.OnAppStart(func() { jobs.Schedule("0 0 0 * * ?", ReminderEmails{}) jobs.Schedule("@midnight", ReminderEmails{}) jobs.Schedule("@every 24h", ReminderEmails{}) jobs.Every(24 * time.Hour, ReminderEmails{}) }) } ##命名的調度器 可以在`app.conf`定義一個調度器,然后在任何地方引用它,這樣有助於提供容易理解並且可重用的調度器。 在`app.conf`定義一個命名的調度器: cron.workhours_15m = 0 */15 9-17 ? * MON-FRI 在任何地方使用命名的調度器來設置cron描述表達式: func init() { revel.OnAppStart(func() { jobs.Schedule("cron.workhours_15m", ReminderEmails{}) }) } 注意,自定義的調度器名稱必須以`cron.`開頭。 ##一次性任務 有時,相應用戶的請求需要做一些事,jobs模塊允許提交一個單次執行的任務。 type AppController struct { *revel.Controller } func (c AppController) Action() revel.Result { // 處理請求. ... // 現在異步的發送郵件 jobs.Now(SendConfirmationEmail{}) //或者在單位時間之后再異步的發送郵件 jobs.In(time.Minute, SendConfirmationEmail{}) } ##注冊函數 也可以將`func()`方式的函數使用`jobs.Func`類型包裝並當作一個任務: func sendReminderEmails() { // 查詢數據庫 // 發送郵件 } func init() { revel.OnAppStart(func() { jobs.Schedule("@midnight", jobs.Func(sendReminderEmails)) }) } ##任務狀態 jobs模塊提供了一個狀態頁面用來顯示所有的任務調度,以及它們的狀態(IDLE 空閑 或 RUNNING 運行)還有它們上一次以及下一次的運行時間。  安全起見,只有請求來自`127.0.0.1`的時候,次頁面才被顯示。 ##受限的任務池 可以設置jobs任務池大小用來限制同一時間運行任務的數量,這可以允許開發人員限制異步任務所使用的資源 - 如果常規的交互響應權重高於異步處理。如果任務池中正在運行的任務滿了,那么新的任務會被阻塞直到池中有任務完成。 ##開發相關 1、允許以HTTP基本的驗證方式訪問任務狀態頁面 2、允許系統管理員在任務狀態頁面以交互方式運行調度任務 3、為任務的運行提供能多的可視化效果,如池大小,隊列長度