Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
40
Help us understand the problem. What is going on with this article?
@Hijiri-K

heroku schedulerの使い方 herokuで簡単な処理を定期的に自動的に実行する

More than 3 years have passed since last update.

概要

以前書いた記事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というファイルを作成して、そこに記述するのが一般的らしい。
公式に「これをコピーして書き替えろ」というコードのサンプルが載っているのでその通りにする。

サンプルコード

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

今回、私が作成したコード

lib/tasks/scheduler.rake
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=アクセスキー&currencies=' + 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を使用したやり方しか見つからなかった。
今回は公式サイトのやり方をそのまま行ったら、簡単に実装することができた。

40
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Hijiri-K

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
40
Help us understand the problem. What is going on with this article?