#概要
以前書いた記事APIで複数通貨のレートを効率よく完全自動でデータベースに登録する方法! メンテナンスも簡単!で作成した、完全自動でレートを登録するコードをheroku上で1日に一回、自動的に実行したいと考えた。
railsで処理を定期的に実行する方法を調べてみると、cornなどのgemを使う方法も見つかったが、今回はherokuでの利用に限定されるが、最も簡単に実装できそうなheroku schedulerを使った実装を紹介する。
やり方は、以下の公式サイトを参考にした。
https://devcenter.heroku.com/articles/scheduler
#事前準備
Heroku schedulerのadd-on自体は無料枠があり、無料で利用することができるが、アプリにadd-onを追加するためにはアカウントのverificationが必要であり、クレジットカードの登録が必要である。
#やり方
##1.実行したいタスクの作成
公式によるとrailsでは定期的に実行したい処理は、 lib/tasks/scheduler.rake
というファイルを作成して、そこに記述するのが一般的らしい。
公式に「これをコピーして書き替えろ」というコードのサンプルが載っているのでその通りにする。
サンプルコード
desc "This task is called by the Heroku scheduler add-on"
task :update_feed => :environment do
puts "Updating feed..."
NewsFeed.update
puts "done."
end
task :send_reminders => :environment do
User.send_reminders
end
今回、私が作成したコード
desc "This task is called by the Heroku scheduler add-on"
task :test_scheduler => :environment do
puts "scheduler test"
puts "it works."
end
task :update_rates => :environment do
ENV["SSL_CERT_FILE"] = "app/controllers/cacert.pem"
require 'open-uri'
sources = ["USD","JPY","EUR","CNY", "KRW","THB", "VND", "SGD", "PHP"]
currencies = sources.join(',')
sources.each do |source|
res = open('https://apilayer.net/api/live?access_key=アクセスキー¤cies=' + currencies + '&source=' + source + '&format=1')
code, message = res.status # res.status => ["200", "OK"]
if code == '200'
result = ActiveSupport::JSON.decode res.read
# resultを使ってなんやかんや処理をする
@result = result['quotes'] #返ってきたjsonデータをrubyの配列に変換
@result.each do |key, value|
rate = Exchange.find_or_create_by(currency: key)
rate.update(currency: key, rate: value)
end
else
puts "Error!! #{code} #{message}"
end
puts @result
end
end
rakeコマンドで実行できているかを確認するために文字列を出力する
test_schedulerというタスクも作った。
作成したら、コマンドラインラインから動作チェック
$rake test_scheduler
##2. heroku schedulerのadd-onをアプリにインストール
herokuの自分のアカウントでheroku schedulerをインストールしたいアプリを開き、dashbordからconfigure Add-onsを開き、指示に従ってインストール。
##3. jobの登録
dashbordのheroku schedulerをクリックしjobを登録し、時間などを設定する。
$rake test_scheduler
時間の設定はUTCで指定する点に注意。
これで終わり。
#感想
Heroku schedulerの使い方を解説した記事はとても少なく、しかも、様々なgemを使用したやり方しか見つからなかった。
今回は公式サイトのやり方をそのまま行ったら、簡単に実装することができた。