Revel 計(jì)劃任務(wù)

2022-07-28 14:12 更新

Revel 支持計(jì)劃任務(wù)(異步執(zhí)行), 運(yùn)行在請(qǐng)求流程的外部。比如,更新緩存數(shù)據(jù)的周期性任務(wù),或發(fā)送電子郵件的臨時(shí)任務(wù)。

Revel 計(jì)劃任務(wù)激活

該框架是一個(gè)可選模塊,默認(rèn)是禁用的。要將它激活,需要在配置文件中添加該模塊:

module.jobs = github.com/revel/revel/modules/jobs

此外,為了訪問(wèn)計(jì)劃任務(wù)的監(jiān)控頁(yè)面,需要將下面的內(nèi)容添加到路由文件中:

module:jobs

這條語(yǔ)句將插入 /@jobs 路由

選項(xiàng)

有兩個(gè)選項(xiàng)來(lái)限制計(jì)劃任務(wù)。

這個(gè)例子顯示了它們的默認(rèn)值。

jobs.pool = 10                # 允許同時(shí)運(yùn)行的任務(wù)數(shù)
jobs.selfconcurrent = false   # 一個(gè)任務(wù)只允許一個(gè)實(shí)例

啟動(dòng)計(jì)劃任務(wù)

應(yīng)用程序啟動(dòng)時(shí), 使用revel.OnAppStart 注冊(cè)一個(gè)函數(shù)來(lái)運(yùn)行一個(gè)任務(wù)。Revel 在服務(wù)啟動(dòng)之前,會(huì)連續(xù)啟動(dòng)這些任務(wù)。 請(qǐng)注意,此功能實(shí)際上并未使用計(jì)劃任務(wù)模塊,它被用來(lái)提交任務(wù),但并不阻止服務(wù)器的啟動(dòng)。

func init() {
    revel.OnAppStart(func() { jobs.Now(populateCache{}) })
}

周期性任務(wù)

任務(wù)可以被指定在任意時(shí)間運(yùn)行。使用的時(shí)間表有兩個(gè)選項(xiàng):

  1. 一個(gè)cron時(shí)間格式
  2. 固定時(shí)間間隔

Revel 使用 cron library 來(lái)解析時(shí)間表和任務(wù)。cron庫(kù)的說(shuō)明 提供了時(shí)間格式的詳細(xì)描述。

計(jì)劃任務(wù)通常使用 revel.OnAppStart 鉤子進(jìn)行注冊(cè),但也可以在以后的任何時(shí)間注冊(cè)。

下面是一些例子:

import (
    "github.com/revel/revel"
    "github.com/revel/revel/modules/jobs/app/jobs"
    "time"
)

type ReminderEmails struct {
    // 過(guò)濾
}

func (e ReminderEmails) Run() {
    // 查詢(xún)數(shù)據(jù)庫(kù)
    // 發(fā)送電子郵件
}

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{})
    })
}

時(shí)間表

您可以在 app.conf文件中配置時(shí)間表,并在任何地方引用。這可以為 crontab 格式提供易于重用和有用的說(shuō)明。

在 app.conf定義你的時(shí)間表,:

cron.workhours_15m = 0 */15 9-17 ? * MON-FRI

使用一個(gè)cron規(guī)范指定時(shí)間表,就可以在任何地方引用它。

func init() {
    revel.OnAppStart(func() {
        jobs.Schedule("cron.workhours_15m", ReminderEmails{})
    })
}

注意: cron 時(shí)間表的名字必須以 “cron.”開(kāi)頭

臨時(shí)任務(wù)

有時(shí)候在響應(yīng)用戶(hù)的一個(gè)操作時(shí),還要處理一些事情。在這種情況下,模塊可以在某個(gè)時(shí)間運(yùn)行一個(gè)任務(wù)。

模塊提供的唯一控制是等待多長(zhǎng)時(shí)間運(yùn)行任務(wù)。

type AppController struct { *revel.Controller }

func (c AppController) Action() revel.Result {
    // 處理請(qǐng)求
    ...

    // 立即發(fā)送電子郵件(異步)
    jobs.Now(SendConfirmationEmail{})

    // 或者,一分鐘后發(fā)送電子郵件(異步)。
    jobs.In(time.Minute, SendConfirmationEmail{})
}

注冊(cè)函數(shù)

通過(guò)使用jobs.Func類(lèi)型包裝一個(gè)func()函數(shù),來(lái)注冊(cè)一個(gè)任務(wù)。例如:

func sendReminderEmails() {
    // 查詢(xún)數(shù)據(jù)庫(kù)
    // 發(fā)送電子郵件
}

func init() {
    revel.OnAppStart(func() {
        jobs.Schedule("@midnight", jobs.Func(sendReminderEmails))
    })
}

任務(wù)狀態(tài)

模塊提供了一個(gè)狀態(tài)頁(yè)面,用來(lái)顯示任務(wù)的運(yùn)行狀態(tài)(IDLE 或 RUNNING), 以及之前和下次運(yùn)行時(shí)間。

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)