Go Revel - Jobs(任务调度模块)

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 运行)还有它们上一次以及下一次的运行时间。

jobs

安全起见,只有请求来自127.0.0.1的时候,次页面才被显示。

受限的任务池

可以设置jobs任务池大小用来限制同一时间运行任务的数量,这可以允许开发人员限制异步任务所使用的资源 - 如果常规的交互响应权重高于异步处理。如果任务池中正在运行的任务满了,那么新的任务会被阻塞直到池中有任务完成。

开发相关

1、允许以HTTP基本的验证方式访问任务状态页面

2、允许系统管理员在任务状态页面以交互方式运行调度任务

3、为任务的运行提供能多的可视化效果,如池大小,队列长度

posted on   黑暗伯爵  阅读(3639)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示