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](http://robfig.github.io/revel/img/jobs-status.png "jobs")

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

##受限的任务池

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

##开发相关

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

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

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

Go Revel - Jobs(任务调度模块)的更多相关文章

  1. Go Revel 学习指南

    Go Revel 学习指南 CONTROLLERS(控制器) Routing(路由)http://www.cnblogs.com/hangxin1940/p/3267065.html Paramete ...

  2. Go语言实战 - revel框架教程之缓存和Job

    所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了.我知道一个PV过亿的站点就是全站静态(以前新浪也是), ...

  3. revel框架教程之缓存和Job

    Go语言实战 - revel框架教程之缓存和Job   所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了 ...

  4. Go Revel - app.conf

    ##概览 `app.conf`为应用程序的配置文件,它使用`goconfig`的语法,与windows的ini文件类似. 示例: app.name=chat app.secret=pJLzyoiDe1 ...

  5. Go Revel - main函数分析

    运行revel命令时,首先会编译整个项目,在编译时,会根据`app.conf`配置文件生成两个源码文件`tmp/main.go`.`routes/routes.go`,其中`main.go`是整个项目 ...

  6. Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护

    CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山坡网之前属于第一种情况,哈哈,所以至今没什么问题. ...

  7. golang-web框架revel一个表单提交的总结

    这里要介绍好是revel框架的表单post提交的列子,主要是用于入门学习,和一些知识点的讲解: 首先: 来了解一个问题那就是重复提交表单,做过form表单提交的同学都知道,如果表单提交后不做处理,那么 ...

  8. Go语言实战 - revel框架教程之MongDB的最佳搭档revmgo

    由于revel框架本身对于model层的编写没有提供任何指导,所以在设计这部分的时候就有些犹豫,反复斟酌到底怎样才算是最佳实践. 我在做山坡网的时候刚开始也纠结了一下,拿不准mongodb的sessi ...

  9. Go语言实战 - revel框架教程之权限控制

    一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构的,每一个url其实都会映射到一个具体的Cont ...

随机推荐

  1. SpringMvc @ResponseBody

    一.@Response使用条件 二. @Response在最小配置.jackson的jar包情况下,json中包含的日期类型字段都是以时间戳long类型返回 三. Jack序列化对象转为JSON的限制 ...

  2. hdu4035 Maze

    题目链接 hdu4035 Maze 题解 f[u]表示在节点u通关的所需的边数期望 转移方程分叶子节点和非叶子点讨论 发现都可以化成f[x]=af[1]+bf[dad]+c的形式 然后推一下系数 还是 ...

  3. Django-自定义增删改查组件的一些体会

    1.路由系统 namespace,用于区分相同name的url,通过namespace为url添加一个前缀 反向生成URL的时候 reverse('namespace:name') {% url &q ...

  4. Wamp下安装Memcached

    最近的项目要用到memcache,所以要在本地安装,安装过程中很遇到一些问题,在这里记录下. 我使用的是wamp集成环境,各个版本如下: WampServer Version 2.2 Apache V ...

  5. UML类图的几个名词及对应符号

    实现(Implements) 实现的符号为:\(--- \triangleright\) 箭头指向接口. 泛化/继承(Inheritance) 继承的符号为:$ -\triangleright $ 箭 ...

  6. hdu 4339 Query(两种思路求解)

    Query Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Su ...

  7. 转:深入理解Java G1垃圾收集器

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...

  8. VMware内CentOS7虚拟机硬盘扩容

    转自:https://blog.csdn.net/Wang_Xin_SH/article/details/77872885 简介 CentOS7虚拟机原硬盘空间只分配了10GB,需要扩容到20GB.  ...

  9. 后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况,以及解决方案

    后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况.例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440. 解决方法: ...

  10. Hyperledger超级账本在Centos7下搭建运行环境

    超级账本(hyperledger)是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目,加入成员包括:荷兰银行(ABN AMRO).埃森哲(Accenture)等十几个不同利益体 ...