Fork me on GitHub
buset mendungnya tebel banget nih pagi2

Scheduling With Rufus Scheduler

Posted: August 20th, 2009 | Author: gozali | Filed under: Life, Rails, Ruby | Tags: , , | 2 Comments »

Saya mendapat sebuah proyek kecil, tujuannya sangat sederhana yaitu mengambil semua data dari sebuah website dan menyimpannya ke dalam database untuk kemudian ditampilkan kembali lewat wordpress, data tersebut kemudian harus selalu up-to-date sesuai dengan website yang akan di-crawl. Ini berarti saya membutuhkan sebuah proses penjadwalan tugas untuk memeriksa apakah ada update di website tersebut, karena kita mengambilnya secara “ilegal”. Proses crawlingnya sendiri menggunakan hpricot, kurang lebih isinya seperti ini, masih kotor saya pasang di model property.rb.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
require 'rubygems'
require 'hpricot'
require 'open-uri'
 
class Property < ActiveRecord::Base
class << self
def scrap(page)
  resultset = []
  doc = Hpricot open("http://www.xxxxx.com/property_list?page=#{page}")
  items = doc.search("html_tag")
  items.each do |item|
    title = item.at("h4").innerText.gsub(/(&nbsp;|\n|\s)+/im, ' ').squeeze(' ').strip unless item.at("h4").nil?
    link = item.at("a").attributes["href"].gsub(/(&nbsp;|\n|\s)+/im, ' ').squeeze(' ').strip unless item.at("a").nil?
    resultset << { :title => title, :link => link }
  end
  resultset
end
 
def get_latest_update
  Property.create!(scrap(1))
end

Balik lagi ke masalah task scheduling alias penjadwalan tugas, saya biasanya mengandalkan crontab, atau kalau lagi disiplin ya ngelirik ke backgroundDrb, tapi untuk tugas yang satu ini kayaknya terlalu ribet kalo pake BackgroundDrb dan saya lagi nggak pengen pake crontab.

Akhirnya saya menemukan solusi yang menurut saya sangat affordable di Rails Inside. Dan saya pun memutuskan untuk mempelajari Rufus Scheduler dengan proyek kecil tadi sebagai kelinci percobaannya. Bagaimana caranya?

Pertama pastinya install gem rufus-scheduler. Kalo perlu froze gem-nya ke vendor/gems.

1
sudo gem install rufus-scheduler

Lalu buat file bernama task_scheduler.rb di dalam direktori config/initializers. Isinya kurang lebih seperti ini :

1
2
3
4
5
scheduler = Rufus::Scheduler.start_new
 
scheduler.every("1h") do
   Property.get_latest_update!
end

Kita dapat memanggil metode yang ada di model langsung ke file task_scheduler tersebut, layaknya rake task. Mudah dan sederhana bukan? tanpa crontab dan lebih mudah dibaca serta di-maintain dibanding crontab.