🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Revel 支持计划任务(异步执行), 运行在请求流程的外部。比如,更新缓存数据的周期性任务,或发送电子邮件的临时任务。 ## 激活 该框架是一个可选模块,默认是禁用的。要将它激活,需要在配置文件中添加该模块: ~~~ module.jobs = github.com/revel/revel/modules/jobs ~~~ 此外,为了访问计划任务的监控页面,需要将下面的内容添加到路由文件中: ~~~ module:jobs ~~~ 这条语句将插入 `/@jobs` 路由 ## 选项 有两个选项来限制计划任务。 这个例子显示了它们的默认值。 ~~~ jobs.pool = 10 # 允许同时运行的任务数 jobs.selfconcurrent = false # 一个任务只允许一个实例 ~~~ ## 启动计划任务 应用程序启动时, 使用[`revel.OnAppStart`](http://gorevel.cn/docs/docs/godoc/init.html#OnAppStart) 注册一个函数来运行一个任务。Revel 在服务启动之前,会连续启动这些任务。 请注意,此功能实际上并未使用计划任务模块,它被用来提交任务,但并不阻止服务器的启动。 ~~~ func init() { revel.OnAppStart(func() { jobs.Now(populateCache{}) }) } ~~~ ## 周期性任务 任务可以被指定在任意时间运行。使用的时间表有两个选项: 1. 一个cron时间格式 2. 固定时间间隔 Revel 使用 [cron library](https://github.com/revel/cron) 来解析时间表和任务。[cron库的说明](https://github.com/revel/cron/blob/master/README.md) 提供了时间格式的详细描述。 计划任务通常使用 [`revel.OnAppStart`](http://gorevel.cn/docs/docs/godoc/init.html#OnAppStart) 钩子进行注册,但也可以在以后的任何时间注册。 下面是一些例子: ~~~ import ( "github.com/revel/revel" "github.com/revel/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`文件中配置时间表,并在任何地方引用。这可以为 crontab 格式提供易于重用和有用的说明。 在 `app.conf`定义你的时间表,: ~~~ cron.workhours_15m = 0 */15 9-17 ? * MON-FRI ~~~ 使用一个cron规范指定时间表,就可以在任何地方引用它。 ~~~ func init() { revel.OnAppStart(func() { jobs.Schedule("cron.workhours_15m", ReminderEmails{}) }) } ~~~ > 注意: cron 时间表的名字必须以 “cron.”开头 ## 临时任务 有时候在响应用户的一个操作时,还要处理一些事情。在这种情况下,模块可以在某个时间运行一个任务。 模块提供的唯一控制是等待多长时间运行任务。 ~~~ type AppController struct { *revel.Controller } func (c AppController) Action() revel.Result { // 处理请求 ... // 立即发送电子邮件(异步) jobs.Now(SendConfirmationEmail{}) // 或者,一分钟后发送电子邮件(异步)。 jobs.In(time.Minute, SendConfirmationEmail{}) } ~~~ ## 注册函数 通过使用`jobs.Func`类型包装一个`func()`函数,来注册一个任务。例如: ~~~ func sendReminderEmails() { // 查询数据库 // 发送电子邮件 } func init() { revel.OnAppStart(func() { jobs.Schedule("@midnight", jobs.Func(sendReminderEmails)) }) } ~~~ ## 任务状态 模块提供了一个状态页面,用来显示任务的运行状态(**IDLE** 或 **RUNNING**), 以及之前和下次运行时间。 ![](https://box.kancloud.cn/2015-10-20_5625fc00ebef6.png) 为了安全起见,状态页面仅接受127.0.0.1发起的请求。 ## 限制池的大小 任务模块配置,用来限制同一时间运行的任务数量。这允许开发人员限制可能会潜在地使用异步任务的资源 - 通常是交互式的响应高于异步处理。当池中正在运行的任务已满,新的任务将阻塞,直到正在运行的任务完成。 注意事项:计划任务在一个channel上阻塞,为等待的goroutines实现了一个FIFO (但没有指定/需要这样). [参考这里的讨论](https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/CPwv8WlqKag). ## 开发状态 * 允许使用HTTP基本身份验证凭据访问任务状态页面 * 允许管理员从状态页面以交互方式执行预定任务 * 支持更多的页面属性,例如:池的大小,任务队列长度等。