diff --git a/Gemfile b/Gemfile index 6e61d36c64..456fa6a561 100644 --- a/Gemfile +++ b/Gemfile @@ -8,6 +8,7 @@ gem "rubytree", "~> 0.5.2", :require => 'tree' gem "rdoc", ">= 2.4.2" # Needed only on RUBY_VERSION = 1.8, ruby 1.9+ compatible interpreters should bring their csv gem "fastercsv", "~> 1.5.0", :platforms => [:ruby_18, :jruby, :mingw_18] +gem 'delayed_job', "~>2.0.4" group :test do gem 'shoulda', '~> 2.10.3' diff --git a/Rakefile b/Rakefile index e1b7068de5..5ec9435523 100644 --- a/Rakefile +++ b/Rakefile @@ -15,3 +15,9 @@ rescue LoadError end require 'tasks/rails' + +begin + require 'delayed/tasks' +rescue LoadError + STDERR.puts "Run `rake gems:install` to install delayed_job" +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 35263c21e2..ce16b10396 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -209,7 +209,8 @@ class UsersController < ApplicationController end def destroy - @user.destroy + # as destroying users is a lengthy process we handle it in the background + @user.send_later(:destroy) flash[:notice] = l('account.deleted') logged_user = nil diff --git a/config/initializers/delayed_job_config.rb b/config/initializers/delayed_job_config.rb new file mode 100644 index 0000000000..399e3c1337 --- /dev/null +++ b/config/initializers/delayed_job_config.rb @@ -0,0 +1 @@ +Delayed::Worker.logger = Rails.logger diff --git a/db/migrate/20120529090411_create_delayed_jobs.rb b/db/migrate/20120529090411_create_delayed_jobs.rb new file mode 100644 index 0000000000..ac579dfcd7 --- /dev/null +++ b/db/migrate/20120529090411_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/script/delayed_job b/script/delayed_job new file mode 100755 index 0000000000..edf195985f --- /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