プログラミング

Ruby on Rails でバッチ処理を実装する

ruby on rails eyecatch

プログラミンでの醍醐味はやはり自動化処理ではないでしょうか?

定型的な処理はできる限り自動的に実行できるようにして、問題が起きたときだけ確認できるようにしておくと、長い目で見て多くの時間を節約することにも繋がります。

この記事では、Ruby on RailsとRailsのrunner、whenever(crontab)を使って、定期的に処理を実行するサンプルを記載します。

バッチ処理のコードを実装する

まずは、定期的に行いたい処理を定義し、コマンドで実行できるようにします。

Railsには、大きく、「runner」と「task」という2種類のコマンドでバッチ処理を書くことが出来ます。今回は「runner」を使用します。

まずは、Batchクラスのファイルを用意します。

「runner」の場合は、ファイルの格納先は柔軟に決めることができるのですが、今回はバッチ処理として実装するので、libフォルダ配下にbatchフォルダを作成し、その配下に、test_batch.rbを実装することにします。

# lig/batch/test_batch.rb

class Batch::TestBatch
  def self.testBatch
    puts '--- Batch::TestBatch.testBatch ---'

    sns = SlackNotificationService.new
    channel = "#channel"
    title = "test"
    body = "test"
    sns.send_notification(channel: channel, title: title, body: body)
  end
end

実行完了を確認するために、今回は「puts」と「slack通知」の処理を記述します。適宜、各自の要件に併せて変更してください。動作確認のために実装するだけであれば、「puts」で標準出力するだけでも十分です。

コマンドで実行してみる

batchファイルの実装が完了したら、次は手動で実行してみます。

bundle exec rails runner Batch::TestBatch.testBatch

標準出力やslackへの通知が届いていれば動作確認完了です。

一つ一つ動作を確認していくことは問題を特定するためには非常に重要なプロセスになります。例えば、crontabまで実装したあとで、処理が一貫して動かない場合は、結局一つ一つ確認していくことになります。

wheneverの実装

次に定期実行するためのモジュール「whenever」を導入します。

wheneverとは、linuxサーバーでのcrontabの設定をrubyで簡単に行える、ラッパーライブラリです。

wheneverの導入

# Gemfile
gem 'whenever'
bundle install

wheneverの初期化

ターミナルで以下を実行します。

bundle exec wheneverize .
[add] writing './config/schedule.rb'
[done] wheneverized!

config配下にschedule.rbが作成されます。

scheduole.rbの設定

先程実装したバッチ処理を毎分実行するようにしてみます。

# schedule.rb

every 1.minute do
  runner "Batch::TestBatch.testBatch"
end

schedule.rbの記述方法の詳細は、wheneverの公式ドキュメントを参照してください。
GitHub whenever

crontabの設定

schedule.rbの設定が完了したら、次はcrontabに反映させます。

crontabに設定されている内容を確認

crontab -l

現時点では何も設定していないので、何も表示されないことを確認します。

処理の確認

bundle exec whenever

このコマンドを実行することで、crontabに反映される内容が表示されます。

crontabへの反映

bundle exec whenever —-update-crontab

“bundle exec whenever”で確認した内容をcrontabに反映します。

この状態で、再度

crontab -l

を実行してみましょう。

処理がcrontabに反映されていることがわかります。

今回は毎分の処理実行としているので、1分ごとに標準出力されていたり、slackへの通知が届いていたりすると思います。

crontabに設定した内容を削除する

bundle exec whenever —-clear-crontab

crontabを手で修正する

crontab -e

これでvimで手動で修正することも可能です。