• 计划任务
    • 激活
    • 选项
    • 启动计划任务
    • 周期性任务
    • 时间表
    • 临时任务
    • 注册函数
    • 任务状态
    • 限制池的大小
    • 开发状态

    计划任务

    Revel 支持计划任务(异步执行), 运行在请求流程的外部。比如,更新缓存数据的周期性任务,或发送电子邮件的临时任务。

    激活

    该框架是一个可选模块,默认是禁用的。要将它激活,需要在配置文件中添加该模块:

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

    此外,为了访问计划任务的监控页面,需要将下面的内容添加到路由文件中:

    1. module:jobs

    这条语句将插入 /@jobs 路由

    选项

    有两个选项来限制计划任务。

    这个例子显示了它们的默认值。

    1. jobs.pool = 10 # 允许同时运行的任务数
    2. jobs.selfconcurrent = false # 一个任务只允许一个实例

    启动计划任务

    应用程序启动时, 使用revel.OnAppStart 注册一个函数来运行一个任务。Revel 在服务启动之前,会连续启动这些任务。 请注意,此功能实际上并未使用计划任务模块,它被用来提交任务,但并不阻止服务器的启动。

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

    周期性任务

    任务可以被指定在任意时间运行。使用的时间表有两个选项:

    • 一个cron时间格式
    • 固定时间间隔
      Revel 使用 cron library 来解析时间表和任务。cron库的说明 提供了时间格式的详细描述。

    计划任务通常使用 revel.OnAppStart 钩子进行注册,但也可以在以后的任何时间注册。

    下面是一些例子:

    1. import (
    2. "github.com/revel/revel"
    3. "github.com/revel/revel/modules/jobs/app/jobs"
    4. "time"
    5. )
    6.  
    7. type ReminderEmails struct {
    8. // 过滤
    9. }
    10.  
    11. func (e ReminderEmails) Run() {
    12. // 查询数据库
    13. // 发送电子邮件
    14. }
    15.  
    16. func init() {
    17. revel.OnAppStart(func() {
    18. jobs.Schedule("0 0 0 * * ?", ReminderEmails{})
    19. jobs.Schedule("@midnight", ReminderEmails{})
    20. jobs.Schedule("@every 24h", ReminderEmails{})
    21. jobs.Every(24 * time.Hour, ReminderEmails{})
    22. })
    23. }

    时间表

    您可以在 app.conf文件中配置时间表,并在任何地方引用。这可以为 crontab 格式提供易于重用和有用的说明。

    app.conf定义你的时间表,:

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

    使用一个cron规范指定时间表,就可以在任何地方引用它。

    1. func init() {
    2. revel.OnAppStart(func() {
    3. jobs.Schedule("cron.workhours_15m", ReminderEmails{})
    4. })
    5. }
    注意: cron 时间表的名字必须以 “cron.”开头

    临时任务

    有时候在响应用户的一个操作时,还要处理一些事情。在这种情况下,模块可以在某个时间运行一个任务。

    模块提供的唯一控制是等待多长时间运行任务。

    1. type AppController struct { *revel.Controller }
    2.  
    3. func (c AppController) Action() revel.Result {
    4. // 处理请求
    5. ...
    6.  
    7. // 立即发送电子邮件(异步)
    8. jobs.Now(SendConfirmationEmail{})
    9.  
    10. // 或者,一分钟后发送电子邮件(异步)。
    11. jobs.In(time.Minute, SendConfirmationEmail{})
    12. }

    注册函数

    通过使用jobs.Func类型包装一个func()函数,来注册一个任务。例如:

    1. func sendReminderEmails() {
    2. // 查询数据库
    3. // 发送电子邮件
    4. }
    5.  
    6. func init() {
    7. revel.OnAppStart(func() {
    8. jobs.Schedule("@midnight", jobs.Func(sendReminderEmails))
    9. })
    10. }

    任务状态

    模块提供了一个状态页面,用来显示任务的运行状态(IDLERUNNING), 以及之前和下次运行时间。

    Job Status Page

    为了安全起见,状态页面仅接受127.0.0.1发起的请求。

    限制池的大小

    任务模块配置,用来限制同一时间运行的任务数量。这允许开发人员限制可能会潜在地使用异步任务的资源 - 通常是交互式的响应高于异步处理。当池中正在运行的任务已满,新的任务将阻塞,直到正在运行的任务完成。

    注意事项:计划任务在一个channel上阻塞,为等待的goroutines实现了一个FIFO (但没有指定/需要这样). 参考这里的讨论.

    开发状态

    • 允许使用HTTP基本身份验证凭据访问任务状态页面
    • 允许管理员从状态页面以交互方式执行预定任务
    • 支持更多的页面属性,例如:池的大小,任务队列长度等。