欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Rails创建定时任务

程序员文章站 2022-03-24 12:01:48
...

 

 

Task & Rexcel

最终生成的报表需要excel格式,我用了Rexcel这个插件,先写下一个task(/lib/task/task.rake)

namespace :reports do
  desc "my report"
  task :my_report => :environment do
     arr = ActiveRecord::Base.connection.execute("#{your sql}").to_a
    workbook = Rexcel::Workbook.new
    worksheet = workbook.add_worksheet("reports")
    worksheet.add_line(["col1", "col2", "col3"])
    worksheet.add_lines(arr)
    Rails.logger.info("===================begin to write excel")
    File.open("#{RAILS_ROOT}/public/uploads/reports/#{month}月报表.xls", "w") do |f|
      f.write(workbook.build)
    end 
  end
end

Crontab & whenever

cron是unix的一个系统工具,用来在后台执行一些定时任务,crontab就是定义这些定时任务的文件

crontab commands

  • crontab -e Edit your crontab file, or create one if it doesn’t already exist.
  • crontab -l Display your crontab file
  • crontab -r Remove your crontab file

whenever

whenever是一个用来生成可读性更好的crontab的gem

config/schedule.rb中写完任务

# 每个月1号凌晨4点执行任务
every '0 4 1 * *' do
  rake "reports:my_report"
end

在控制台直接执行whenver,得到原生的crontab line,放到部署应用的机器上

关于rake task传参

如果想在控制台手动执行task,也许需要传一些参数,写法是这样

desc "模版应用次数统计报表 -- 手动执行,输入月份"
task :my_task_by_params, [:arg1, :arg2] => :environment do |t, args|
  puts args.arg1
  puts args.arg2
  # your code ...
end

控制台执行RAILS_ENV=production rake my_task_by_params[1, 2]

如果用的是zsh的话,这个rake命令可能会出问题,记得用noglob,出处