have destroying user executed as a background task

* using delayed_job as the gem for that
* this could also be used for other background-jobs that are currently implemented using cron
pull/41/head
Jens Ulferts 13 years ago committed by Martin Czuchra
parent e65401764e
commit 5e13836c17
  1. 1
      Gemfile
  2. 6
      Rakefile
  3. 3
      app/controllers/users_controller.rb
  4. 1
      config/initializers/delayed_job_config.rb
  5. 21
      db/migrate/20120529090411_create_delayed_jobs.rb
  6. 5
      script/delayed_job

@ -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'

@ -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

@ -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

@ -0,0 +1 @@
Delayed::Worker.logger = Rails.logger

@ -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

@ -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
Loading…
Cancel
Save