#【Rails】whenever による定時バッチ処理
Wheneverを使ってRailsでのバッチ処理を実装したのでまとめます。
目次
動作環境
OS : macOS Mojave 10.14.6
ruby : 2.6.3p62
rails : 5.2.4
やりたいこと
決まった時間に定期的に実行するタスクを作成したい
手順
wheneverのインストール
Gemfile
gem 'whenever', require: false
インストールの実行
Bundle install
railsにlibを加える
Railsがlibフォルダを読み込めるように設定します
libフォルダにバッチ処理をするファイルを置くためです.
class Application < Rails::Application
config.autoload_paths += Dir["#{config.root}/lib"]
end
バッチ処理の記載
libにbatchというフォルダを作成し、その中に定期実行するファイルを作成します。
Batch::以降は任意の名前で良いです。
例
batch/deadline_cleaner.rb
deadline_cleaner
class Batch::DeadlineClear
def self.deadline_clear
puts DateTime.now
puts 'Test'
end
end
確認
$ bundle exec rails runner Batch::DeadlineClear.deadline_clear
Running via Spring preloader in process 77676
test
schedule.rbの作成・編集
アプリケーションのルートフォルダに移動し、以下のコマンドを実行
$ cd blog-app
$ bundle exec wheneverize .
実行すると config/schedule.rb
が作成されます。
その後、以下のようにschedule.rbにスケジュールと実行したいタスクを記載します。
set :output, 'log/crontab.log'
set :environment, :development
every 1.day, at: '00:00 am' do
runner 'Batch::DeadlineClear.deadline_clear'
end
以下のコマンドでCRONへ反映します.
$ bundle exec whenever --update-crontab
実行結果
実際に1分ごとにバッチ処理がされていることがわかります.
$ cat log/crontab.log
Running via Spring preloader in process 78244
2020-05-29T19:50:01+09:00
test
Running via Spring preloader in process 78534
2020-05-29T19:51:01+09:00
test
Running via Spring preloader in process 78598
2020-05-29T19:52:00+09:00
test
Running via Spring preloader in process 78652