计划任务
该框架是一个可选模块,默认是禁用的。要将它激活,需要在配置文件中添加该模块:
此外,为了访问计划任务的监控页面,需要将下面的内容添加到路由文件中:
这条语句将插入 /@jobs
路由
选项
有两个选项来限制计划任务。
这个例子显示了它们的默认值。
jobs.pool = 10 # 允许同时运行的任务数
启动计划任务
应用程序启动时, 使用revel.OnAppStart
注册一个函数来运行一个任务。Revel 在服务启动之前,会连续启动这些任务。 请注意,此功能实际上并未使用计划任务模块,它被用来提交任务,但并不阻止服务器的启动。
- 一个cron时间格式
- 固定时间间隔
Revel 使用 来解析时间表和任务。cron库的说明 提供了时间格式的详细描述。
计划任务通常使用 钩子进行注册,但也可以在以后的任何时间注册。
下面是一些例子:
- 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{})
- })
- }
时间表
您可以在 文件中配置时间表,并在任何地方引用。这可以为 crontab 格式提供易于重用和有用的说明。
在 app.conf
定义你的时间表,:
cron.workhours_15m = 0 */15 9-17 ? * MON-FRI
使用一个cron规范指定时间表,就可以在任何地方引用它。
临时任务
有时候在响应用户的一个操作时,还要处理一些事情。在这种情况下,模块可以在某个时间运行一个任务。
- type AppController struct { *revel.Controller }
- // 处理请求
- ...
- // 立即发送电子邮件(异步)
- jobs.Now(SendConfirmationEmail{})
- // 或者,一分钟后发送电子邮件(异步)。
- jobs.In(time.Minute, SendConfirmationEmail{})
- }
通过使用类型包装一个func()
函数,来注册一个任务。例如:
- func sendReminderEmails() {
- // 查询数据库
- // 发送电子邮件
- }
- func init() {
- revel.OnAppStart(func() {
- jobs.Schedule("@midnight", jobs.Func(sendReminderEmails))
- })
- }
任务状态
模块提供了一个状态页面,用来显示任务的运行状态(IDLE 或 RUNNING), 以及之前和下次运行时间。
为了安全起见,状态页面仅接受127.0.0.1发起的请求。
限制池的大小
任务模块配置,用来限制同一时间运行的任务数量。这允许开发人员限制可能会潜在地使用异步任务的资源 - 通常是交互式的响应高于异步处理。当池中正在运行的任务已满,新的任务将阻塞,直到正在运行的任务完成。
注意事项:计划任务在一个channel上阻塞,为等待的goroutines实现了一个FIFO (但没有指定/需要这样). 参考这里的讨论.
- 允许使用HTTP基本身份验证凭据访问任务状态页面
- 支持更多的页面属性,例如:池的大小,任务队列长度等。