heroku schedulerを使う
ようやくRSSリーダーが完成しました
セキュリティとかまったく考えていないので、アカウントを作成される際は注意してください。また、同サービスは予告無しに終了しますので、登録したデータは保証されませんのでご注意ください。本気で使い始める人は居ないと思いますが一応。
さて、RSS作成の最後はフィードの自動更新機能の実装です。
■ briefing
今回は、sitesテーブルに登録されているrss_urlからフィードを取得して、feedsテーブルとmainsテーブルに登録します。
なお、フィードの取得はheroku schedulerを使って lib/tasks のrakeファイルを実行させる形とします。今回は計算の結果、1時間間隔で自動収集とします(参考資料参照)。
■ ブランチの作成
今回は記事収集機能を実装するので、"feedRake"というブランチを作成します。
~/workspace/xapp8(master)$ git checkout -b "feedRake"
~/workspace/xapp8(feedRake)$
■ 今回の実装方針
以下の流れの機能を実装して行きます。
① heroku schedulerから"rake db:getfeed"を実行する
② sitesのrss_urlを一件づつ読み込んでフィードを取得する
③ 取得したフィードをfeedsテーブルに登録する
④ Sbscsテーブルを参照して、mainsテーブルを作成する。
■ 登録サイトからフィードを取得(②-④)
登録サイト数が増えれば増えるほどパフォーマンスが低下するのでロジックは再考の余地が大いにあるのですが、動かすことを優先したので以下のような無いようになっています。
lib/tasks/getfeed.rake
namespace :db do
desc "登録されているSitesのフィードを取得してfeedsに格納します"
task getfeed: :environment doSite.find_each do |site|
@fjr = Feedjira::Feed.fetch_and_parse site.rss_url
for num in 0..9 do
@feed = @fjr.entries[num.to_i]
unless @feed.nil? then
@regFed = Feed.new
@regFed.title = @feed.title
@regFed.url = @feed.url
@regFed.publish_at = @feed.published
@regFed.site_id = site.id
unless @feed.summary.nil? then
@regFed.summary = @feed.summary
end
@regFed.saveend # unless @feed.nil? end
end # for end
Sbsc.where(:site_id => site.id).find_each do |sbsc|
Feed.where(:site_id => site.id).find_each do |feed|
Main.create(user_id: sbsc.user_id,
feed_id: feed.id,
read_flg: "f"
)
end
end
end # site.each end
end
end
■ heroku schedulerへの登録(①)
heroku schedulerを使うにはクレジットカードの登録が必要になります。まずは、https://dashboard.heroku.com/account#billing でクレジットカード情報を登録します。
次に add-onの画面からheroku schedulerを選択して、自分のアプリケーションを選択してから"Add Standard for Free"を選択します。
スケジューラーを登録したらschedulerのダッシュボード画面を開いて、タスクを登録します。
実行するコマンドは以下の通りです。
rake db:getfeed
■ 参考資料
heroku scheduler の起動間隔は、1日毎、1時間毎、10分毎から選択できますが、無料枠で済ませる場合には、各タスクの実行時間は以下の範囲内に納める必要があります。
起動間隔 |
min |
sec |
なし |
360 |
21,600 |
1日毎 |
11 |
696 |
1時間毎 |
0.45 |
29 |
10分毎 |
- |
4.8 |