Merge pull request #348 from AyuntamientoMadrid/delayed_jobs

Adds delayed jobs
This commit is contained in:
Juanjo Bazán
2015-09-03 23:45:27 +02:00
13 changed files with 138 additions and 10 deletions

View File

@@ -43,6 +43,9 @@ gem 'paranoia'
gem 'savon'
gem 'dalli'
gem 'rollbar', '~> 2.2.1'
gem 'delayed_job_active_record'
gem 'daemons'
gem 'devise-async'
gem 'ahoy_matey', '~> 1.2.1'
gem 'groupdate' # group temporary data

View File

@@ -107,9 +107,15 @@ GEM
simplecov (~> 0.10.0)
term-ansicolor (~> 1.3)
thor (~> 0.19.1)
daemons (1.2.3)
dalli (2.7.4)
database_cleaner (1.5.0)
debug_inspector (0.0.2)
delayed_job (4.0.6)
activesupport (>= 3.0, < 5.0)
delayed_job_active_record (4.0.3)
activerecord (>= 3.0, < 5.0)
delayed_job (>= 3.0, < 4.1)
devise (3.5.2)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
@@ -117,6 +123,8 @@ GEM
responders
thread_safe (~> 0.1)
warden (~> 1.2.3)
devise-async (0.10.1)
devise (~> 3.2)
diff-lcs (1.2.5)
docile (1.1.5)
domain_name (0.5.24)
@@ -402,9 +410,12 @@ DEPENDENCIES
ckeditor
coffee-rails (~> 4.1.0)
coveralls
daemons
dalli
database_cleaner
delayed_job_active_record
devise
devise-async
email_spec
factory_girl_rails
faker

View File

@@ -8,8 +8,8 @@ class CommentsController < ApplicationController
def create
if @comment.save
Mailer.comment(@comment).deliver_now if email_on_debate_comment?
Mailer.reply(@comment).deliver_now if email_on_comment_reply?
Mailer.comment(@comment).deliver_later if email_on_debate_comment?
Mailer.reply(@comment).deliver_later if email_on_comment_reply?
else
render :new
end

View File

@@ -16,7 +16,7 @@ class Verification::EmailController < ApplicationController
@email = Verification::Email.new(@verified_user)
if @email.save
current_user.reload
Mailer.email_verification(current_user, @email.recipient, @email.encrypted_token).deliver_now
Mailer.email_verification(current_user, @email.recipient, @email.encrypted_token).deliver_later
redirect_to account_path, notice: t('verification.email.create.flash.success', email: @verified_user.email)
else
redirect_to verified_user_path, alert: t('verification.email.create.alert.failure')

View File

@@ -6,7 +6,7 @@ class User < ActiveRecord::Base
apply_simple_captcha
devise :database_authenticatable, :registerable, :confirmable,
:recoverable, :rememberable, :trackable, :validatable, :omniauthable
:recoverable, :rememberable, :trackable, :validatable, :omniauthable, :async
acts_as_voter
acts_as_paranoid column: :hidden_at

5
bin/delayed_job Executable file
View File

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

View File

@@ -33,5 +33,6 @@ module Participacion
# Add lib to the autoload path
config.autoload_paths << Rails.root.join('lib')
config.time_zone = 'Madrid'
config.active_job.queue_adapter = :delayed_job
end
end

View File

@@ -27,7 +27,7 @@ set :pty, true
set :use_sudo, false
set :linked_files, %w{config/database.yml config/secrets.yml}
set :linked_dirs, %w{log tmp public/system public/assets}
set :linked_dirs, %w{log tmp public/system public/assets tmp/pids}
set :keep_releases, 5
@@ -36,6 +36,9 @@ set :local_user, ENV['USER']
# Run test before deploy
set :tests, ["spec"]
set :delayed_job_server_role, :worker
set :delayed_job_args, "-n 2"
# Config files should be copied by deploy:setup_config
set(:config_files, %w(
log_rotation
@@ -55,6 +58,8 @@ namespace :deploy do
after 'deploy:symlink:shared', 'deploy:compile_assets_locally'
after :finishing, 'deploy:beta_testers'
after :finishing, 'deploy:cleanup'
# Restart Delayed Job
after 'deploy:publishing', 'delayed_job:restart'
# Restart unicorn
after 'deploy:publishing', 'deploy:restart'
end

View File

@@ -0,0 +1,13 @@
if Rails.env.test? || Rails.env.development?
Delayed::Worker.delay_jobs = false
else
Delayed::Worker.delay_jobs = true
end
Delayed::Worker.destroy_failed_jobs = false
Delayed::Worker.sleep_delay = 2
Delayed::Worker.max_attempts = 3
Delayed::Worker.max_run_time = 30.seconds
Delayed::Worker.read_ahead = 10
Delayed::Worker.default_queue_name = 'default'
Delayed::Worker.raise_signal_exceptions = :term
Delayed::Worker.logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log'))

View File

@@ -0,0 +1,8 @@
Devise::Async.setup do |config|
if Rails.env.test? || Rails.env.development?
config.enabled = false
else
config.enabled = true
end
config.backend = :delayed_job
end

View File

@@ -0,0 +1,22 @@
class CreateDelayedJobs < ActiveRecord::Migration
def self.up
create_table :delayed_jobs, force: true do |table|
table.integer :priority, default: 0, null: false # Allows some jobs to jump to the front of the queue
table.integer :attempts, default: 0, null: false # Provides for retries, but still fail eventually.
table.text :handler, null: false # 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.string :queue # The name of the queue this job is in
table.timestamps null: true
end
add_index :delayed_jobs, [:priority, :run_at], name: "delayed_jobs_priority"
end
def self.down
drop_table :delayed_jobs
end
end

View File

@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20150903155146) do
ActiveRecord::Schema.define(version: 20150903200440) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -90,8 +90,8 @@ ActiveRecord::Schema.define(version: 20150903155146) do
t.integer "author_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "hidden_at"
t.string "visit_id"
t.datetime "hidden_at"
t.integer "flags_count", default: 0
t.datetime "ignored_flag_at"
t.integer "cached_votes_total", default: 0
@@ -109,6 +109,22 @@ ActiveRecord::Schema.define(version: 20150903155146) do
add_index "debates", ["cached_votes_up"], name: "index_debates_on_cached_votes_up", using: :btree
add_index "debates", ["hidden_at"], name: "index_debates_on_hidden_at", using: :btree
create_table "delayed_jobs", force: :cascade do |t|
t.integer "priority", default: 0, null: false
t.integer "attempts", default: 0, null: false
t.text "handler", null: false
t.text "last_error"
t.datetime "run_at"
t.datetime "locked_at"
t.datetime "failed_at"
t.string "locked_by"
t.string "queue"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree
create_table "flags", force: :cascade do |t|
t.integer "user_id"
t.string "flaggable_type"
@@ -200,13 +216,12 @@ ActiveRecord::Schema.define(version: 20150903155146) do
t.string "unconfirmed_email"
t.boolean "email_on_debate_comment", default: false
t.boolean "email_on_comment_reply", default: false
t.string "phone_number", limit: 30
t.string "official_position"
t.integer "official_level", default: 0
t.datetime "hidden_at"
t.string "phone_number", limit: 30
t.string "username"
t.datetime "confirmed_hide_at"
t.string "sms_confirmation_code"
t.string "username"
t.string "document_number"
t.string "document_type"
t.datetime "residence_verified_at"
@@ -218,6 +233,7 @@ ActiveRecord::Schema.define(version: 20150903155146) do
t.string "unconfirmed_phone"
t.string "confirmed_phone"
t.datetime "letter_requested_at"
t.datetime "confirmed_hide_at"
t.string "letter_verification_code"
end

View File

@@ -0,0 +1,44 @@
namespace :delayed_job do
def args
fetch(:delayed_job_args, "")
end
def delayed_job_roles
fetch(:delayed_job_server_role, :app)
end
desc 'Stop the delayed_job process'
task :stop do
on roles(delayed_job_roles) do
within release_path do
with rails_env: fetch(:rails_env) do
execute :bundle, :exec, :'bin/delayed_job', :stop
end
end
end
end
desc 'Start the delayed_job process'
task :start do
on roles(delayed_job_roles) do
within release_path do
with rails_env: fetch(:rails_env) do
execute :bundle, :exec, :'bin/delayed_job', args, :start
end
end
end
end
desc 'Restart the delayed_job process'
task :restart do
on roles(delayed_job_roles) do
within release_path do
with rails_env: fetch(:rails_env) do
execute :bundle, :exec, :'bin/delayed_job', args, :restart
end
end
end
end
end