Basic delayed job implementation

This commit is contained in:
Andres Keskküla 2014-11-11 17:00:41 +02:00
parent 6aa82dd222
commit 4cedb2cf78
12 changed files with 126 additions and 1 deletions

View file

@ -74,6 +74,11 @@ gem 'rails-settings-cached', '0.4.1'
gem 'net-ssh'
gem 'net-scp'
# delayed job
gem 'delayed_job_active_record', '~> 4.0.2'
# to process delayed jobs
gem 'daemons'
group :development, :test do
gem 'capybara', '~> 2.4.1'
# For feature testing

View file

@ -78,8 +78,14 @@ GEM
coffee-script-source
execjs
coffee-script-source (1.8.0)
daemons (1.1.9)
database_cleaner (1.3.0)
debug_inspector (0.0.2)
delayed_job (4.0.4)
activesupport (>= 3.0, < 4.2)
delayed_job_active_record (4.0.2)
activerecord (>= 3.0, < 4.2)
delayed_job (>= 3.0, < 4.1)
descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1)
devise (3.3.0)
@ -362,7 +368,9 @@ DEPENDENCIES
cancan (~> 1.6.10)
capybara (~> 2.4.1)
coffee-rails (~> 4.0.0)
daemons
database_cleaner (~> 1.3.0)
delayed_job_active_record (~> 4.0.2)
devise (~> 3.3.0)
epp (~> 1.4.0)
epp-xml (~> 0.7.0)

View file

@ -0,0 +1,30 @@
module DomainVersionObserver
extend ActiveSupport::Concern
included do
after_save :delayed_whois_update
end
private
def delayed_whois_update
name = domain_name
return unless name
body = snapshot
delay.update_whois(name, body)
end
# not sure we need to pass in the params since i don't know if delayed job has access to
# all the regular attributes and stuff
def update_whois(domain_name, body)
wd = WhoisDomain.find_or_initialize_by(name: domain_name)
wd.body = body
wd.save!
end
def domain_name
name = reify.try(:name)
name = load_snapshot[:domain][:name] if event == 'create'
return name if name
end
end

View file

@ -1,5 +1,6 @@
class DomainVersion < PaperTrail::Version
include UserEvents
include DomainVersionObserver if Setting.whois_enabled # unless Setting.whois_enabled
scope :deleted, -> { where(event: 'destroy') }

View file

@ -0,0 +1,3 @@
class WhoisDomain < WhoisServer
self.table_name = 'domains'
end

View file

@ -0,0 +1,4 @@
class WhoisServer < ActiveRecord::Base
self.abstract_class = true
establish_connection :"#{Rails.env}_whois"
end

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

@ -17,3 +17,9 @@ test:
production:
<<: *default
database: registry_production
development_whois:
database: whois_development
test_whois:
database: test_whois

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
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: 20141105150721) do
ActiveRecord::Schema.define(version: 20141111105931) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -91,6 +91,22 @@ ActiveRecord::Schema.define(version: 20141105150721) do
t.datetime "updated_at"
end
create_table "delayed_jobs", force: true 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 "delegation_signers", force: true do |t|
t.integer "domain_id"
t.string "key_tag"

View file

@ -77,3 +77,5 @@ Setting.ns_min_count = 2
Setting.ns_max_count = 11
Setting.transfer_wait_time = 0
Setting.whois_enabled = true

23
doc/whois.rm Normal file
View file

@ -0,0 +1,23 @@
Connection with whois
------------------------------------
The easiest way to get started without whois is to change Settings.whois_enabled to false. But like expected,
that disables whois (effects should fully be loaded after restarting the app)
What whois_enabled=false does is that the whois callback does not get included.
Delayed jobs migration and everything else will still be installed tho.
If you wish to use the whois module, tho, you need a whois database looking something like this
```ruby
create_table :domains do |t|
t.string :name
t.text :body
t.timestamps
end
```
NB! Migration with rake tasks is available in whois app repo.
For development, delayed_job queue can be handled by rake task
`rake jobs:work` or if you wish to be fancy you can use a daemon with `bin/delayed_job start`
``