From a7b36e6d0ea93951a0d04f5e188da7f61e561e0f Mon Sep 17 00:00:00 2001 From: magnolia-fan Date: Mon, 20 Jun 2011 01:23:22 +0400 Subject: [PATCH] Added delayed jobs --- Gemfile | 26 +------------------ Gemfile.lock | 7 +++-- app/controllers/artist_controller.rb | 15 ++++++++--- app/controllers/import_controller.rb | 7 +++-- config/initializers/delayed_job.rb | 1 + .../20110618191148_create_delayed_jobs.rb | 21 +++++++++++++++ .../20110618191349_add_status_to_artists.rb | 9 +++++++ db/schema.rb | 18 ++++++++++++- lib/load_artist_job.rb | 5 ++++ script/delayed_job | 5 ++++ 10 files changed, 81 insertions(+), 33 deletions(-) create mode 100644 config/initializers/delayed_job.rb create mode 100644 db/migrate/20110618191148_create_delayed_jobs.rb create mode 100644 db/migrate/20110618191349_add_status_to_artists.rb create mode 100644 lib/load_artist_job.rb create mode 100755 script/delayed_job diff --git a/Gemfile b/Gemfile index 49596e0..f686871 100644 --- a/Gemfile +++ b/Gemfile @@ -2,32 +2,8 @@ source 'http://rubygems.org' gem 'rails', '3.0.8' -# Bundle edge Rails instead: -# gem 'rails', :git => 'git://github.com/rails/rails.git' - gem 'sqlite3' gem 'pg' gem 'awesome_print', :require => 'ap' -# Use unicorn as the web server -# gem 'unicorn' - -# Deploy with Capistrano -# gem 'capistrano' - -# To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+) -# gem 'ruby-debug' -# gem 'ruby-debug19', :require => 'ruby-debug' - -# Bundle the extra gems: -# gem 'bj' -gem 'nokogiri' -# gem 'sqlite3-ruby', :require => 'sqlite3' -# gem 'aws-s3', :require => 'aws/s3' - -# Bundle gems for the local environment. Make sure to -# put test-only gems in this group so their generators -# and rake tasks are available in development mode: -# group :development, :test do -# gem 'webrat' -# end +gem 'delayed_job' diff --git a/Gemfile.lock b/Gemfile.lock index f1596ed..af5cf1a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,6 +31,10 @@ GEM arel (2.0.10) awesome_print (0.4.0) builder (2.1.2) + daemons (1.1.4) + delayed_job (2.1.4) + activesupport (~> 3.0) + daemons erubis (2.6.6) abstract (>= 1.0.0) i18n (0.5.0) @@ -40,7 +44,6 @@ GEM mime-types (~> 1.16) treetop (~> 1.4.8) mime-types (1.16) - nokogiri (1.4.5) pg (0.11.0) polyglot (0.3.1) rack (1.2.3) @@ -73,7 +76,7 @@ PLATFORMS DEPENDENCIES awesome_print - nokogiri + delayed_job pg rails (= 3.0.8) sqlite3 diff --git a/app/controllers/artist_controller.rb b/app/controllers/artist_controller.rb index f7d0562..24dbdf8 100644 --- a/app/controllers/artist_controller.rb +++ b/app/controllers/artist_controller.rb @@ -5,14 +5,23 @@ class ArtistController < ApplicationController data = {} name = params[:name].gsub('%20', ' ').gsub('+', ' ') artist = Artist.find_by_name(name) + if artist and artist.status == 0 + render :json => {status: 'loading'} + return + end unless artist results = ArtistController.musicBrainzExactSearch(name) if results.empty? - render :json => {status: 'not founds'} + render :json => {status: 'not found'} return elsif results[0][:name] == name - ImportController.importArtist(name) - render :json => {status: 'loaded'} + # Saving artist and queueing job + artist = Artist.new + artist.name = name + artist.status = 0 + artist.save + Delayed::Job.enqueue LoadArtistJob.new(name) + render :json => {status: 'loading_started'} return elsif results[0][:name].downcase == name.downcase or results[0][:name].downcase == 'the '+ name.downcase render :json => {status: 'corrected', page: results[0][:name]} diff --git a/app/controllers/import_controller.rb b/app/controllers/import_controller.rb index 1774013..e0c3b32 100644 --- a/app/controllers/import_controller.rb +++ b/app/controllers/import_controller.rb @@ -19,8 +19,8 @@ class ImportController < ApplicationController end # Save artist - artist = Artist.new - artist.name = artist_mb_data[:name] + artist = Artist.find_by_name(name) + #artist.name = artist_mb_data[:name] artist.desc = artist_desc artist.pic_url = artist_pic artist.artist_type = artist_mb_data[:type] @@ -133,6 +133,9 @@ class ImportController < ApplicationController end # mb_albums.each do |mb_album| + artist.status = 1 + artist.save + end # def self.importArtist name end \ No newline at end of file diff --git a/config/initializers/delayed_job.rb b/config/initializers/delayed_job.rb new file mode 100644 index 0000000..654f064 --- /dev/null +++ b/config/initializers/delayed_job.rb @@ -0,0 +1 @@ +require 'load_artist_job' \ No newline at end of file diff --git a/db/migrate/20110618191148_create_delayed_jobs.rb b/db/migrate/20110618191148_create_delayed_jobs.rb new file mode 100644 index 0000000..ac579df --- /dev/null +++ b/db/migrate/20110618191148_create_delayed_jobs.rb @@ -0,0 +1,21 @@ +class CreateDelayedJobs < ActiveRecord::Migration + def self.up + create_table :delayed_jobs, :force => true do |table| + table.integer :priority, :default => 0 # Allows some jobs to jump to the front of the queue + table.integer :attempts, :default => 0 # Provides for retries, but still fail eventually. + table.text :handler # YAML-encoded string of the object that will do work + table.text :last_error # reason for last failure (See Note below) + table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future. + table.datetime :locked_at # Set when a client is working on this object + table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead) + table.string :locked_by # Who is working on this object (if locked) + table.timestamps + end + + add_index :delayed_jobs, [:priority, :run_at], :name => 'delayed_jobs_priority' + end + + def self.down + drop_table :delayed_jobs + end +end \ No newline at end of file diff --git a/db/migrate/20110618191349_add_status_to_artists.rb b/db/migrate/20110618191349_add_status_to_artists.rb new file mode 100644 index 0000000..d7a86b8 --- /dev/null +++ b/db/migrate/20110618191349_add_status_to_artists.rb @@ -0,0 +1,9 @@ +class AddStatusToArtists < ActiveRecord::Migration + def self.up + add_column :artists, :status, :integer + end + + def self.down + remove_column :artists, :status + end +end diff --git a/db/schema.rb b/db/schema.rb index 92dff59..9857dae 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20110617213912) do +ActiveRecord::Schema.define(:version => 20110618191349) do create_table "albums", :force => true do |t| t.string "name" @@ -31,8 +31,24 @@ ActiveRecord::Schema.define(:version => 20110617213912) do t.string "pic_url" t.string "artist_type" t.string "mbid" + t.integer "status" end + create_table "delayed_jobs", :force => true do |t| + t.integer "priority", :default => 0 + t.integer "attempts", :default => 0 + t.text "handler" + t.text "last_error" + t.datetime "run_at" + t.datetime "locked_at" + t.datetime "failed_at" + t.string "locked_by" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority" + create_table "tracks", :force => true do |t| t.string "name" t.integer "album_id" diff --git a/lib/load_artist_job.rb b/lib/load_artist_job.rb new file mode 100644 index 0000000..0184f2d --- /dev/null +++ b/lib/load_artist_job.rb @@ -0,0 +1,5 @@ +class LoadArtistJob < Struct.new(:name) + def perform + ImportController.importArtist(name) + end +end \ No newline at end of file diff --git a/script/delayed_job b/script/delayed_job new file mode 100755 index 0000000..edf1959 --- /dev/null +++ b/script/delayed_job @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby + +require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) +require 'delayed/command' +Delayed::Command.new(ARGV).daemonize