delayed_job_extras 0.4.3 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/delayed_job_extras/action_mailer.rb +36 -0
- data/lib/delayed_job_extras/extras.rb +107 -0
- data/lib/delayed_job_extras/hoptoad.rb +28 -0
- data/lib/delayed_job_extras/is_paranoid.rb +19 -0
- data/lib/delayed_job_extras/job.rb +41 -54
- data/lib/delayed_job_extras/performable_method.rb +5 -31
- data/lib/delayed_job_extras/worker.rb +2 -127
- data/lib/delayed_job_extras.rb +9 -18
- metadata +6 -2
@@ -0,0 +1,36 @@
|
|
1
|
+
if defined?(ActionMailer)
|
2
|
+
module ActionMailer
|
3
|
+
class Base
|
4
|
+
|
5
|
+
def self.inherited(klass)
|
6
|
+
super
|
7
|
+
eval %{
|
8
|
+
class ::#{klass}Worker < DJ::Worker
|
9
|
+
|
10
|
+
attr_accessor :called_method
|
11
|
+
attr_accessor :args
|
12
|
+
|
13
|
+
def initialize(called_method, *args)
|
14
|
+
self.called_method = called_method
|
15
|
+
self.args = args
|
16
|
+
end
|
17
|
+
|
18
|
+
def perform
|
19
|
+
::#{klass}.send(self.called_method, *self.args)
|
20
|
+
end
|
21
|
+
|
22
|
+
class << self
|
23
|
+
|
24
|
+
def method_missing(sym, *args)
|
25
|
+
::#{klass}Worker.enqueue(sym, *args)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
end # Base
|
35
|
+
end # ActionMailer
|
36
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module Delayed
|
2
|
+
class Job
|
3
|
+
module Extras
|
4
|
+
|
5
|
+
PRIORITY_LEVELS = {:immediate => 10000, :high => 1000, :medium => 500, :normal => 0, :low => -100, :who_cares => -1000}
|
6
|
+
|
7
|
+
def self.included(klass)
|
8
|
+
klass.send(:include, Delayed::Job::Extras::InstanceMethods)
|
9
|
+
klass.extend(Delayed::Job::Extras::ClassMethods)
|
10
|
+
klass.class_eval do
|
11
|
+
class << self
|
12
|
+
def new_with_extras(*args)
|
13
|
+
klass = new_without_extras(*args)
|
14
|
+
klass.__original_args = *args
|
15
|
+
return klass
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method_chain :new, :extras
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module InstanceMethods
|
24
|
+
|
25
|
+
attr_accessor :dj_object
|
26
|
+
attr_accessor :run_at
|
27
|
+
attr_accessor :priority
|
28
|
+
attr_accessor :logger
|
29
|
+
attr_accessor :worker_class_name
|
30
|
+
attr_accessor :__original_args
|
31
|
+
attr_accessor :__re_enqueue_block
|
32
|
+
attr_accessor :re_enqueuable
|
33
|
+
|
34
|
+
def priority
|
35
|
+
case @priority
|
36
|
+
when Symbol
|
37
|
+
Delayed::Job::Extras::PRIORITY_LEVELS[@priority] ||= 0
|
38
|
+
when Fixnum
|
39
|
+
@priority
|
40
|
+
else
|
41
|
+
0
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def run_at
|
46
|
+
return @run_at ||= Time.now
|
47
|
+
end
|
48
|
+
|
49
|
+
def logger
|
50
|
+
@logger ||= self.class.logger
|
51
|
+
end
|
52
|
+
|
53
|
+
def worker_class_name
|
54
|
+
@worker_class_name ||= self.class.to_s.underscore
|
55
|
+
end
|
56
|
+
|
57
|
+
def enqueue(priority = self.priority, run_at = self.run_at)
|
58
|
+
Delayed::Job.enqueue(self, priority, run_at)
|
59
|
+
end
|
60
|
+
|
61
|
+
alias_method :save, :enqueue
|
62
|
+
|
63
|
+
def unique?
|
64
|
+
false
|
65
|
+
end
|
66
|
+
|
67
|
+
end # InstanceMethods
|
68
|
+
|
69
|
+
module ClassMethods
|
70
|
+
|
71
|
+
@@logger = SplitLogger.new
|
72
|
+
|
73
|
+
def logger
|
74
|
+
@@logger
|
75
|
+
end
|
76
|
+
|
77
|
+
def logger=(logger)
|
78
|
+
@@logger = logger
|
79
|
+
end
|
80
|
+
|
81
|
+
def priority(level = 0)
|
82
|
+
define_method('priority') do
|
83
|
+
if level.is_a?(Symbol)
|
84
|
+
level = Delayed::Job::Extras::PRIORITY_LEVELS[level] ||= 0
|
85
|
+
end
|
86
|
+
return @priority ||= level
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def enqueue(*args)
|
91
|
+
self.new(*args).enqueue
|
92
|
+
end
|
93
|
+
|
94
|
+
def re_enqueue(&block)
|
95
|
+
define_method('re_enqueuable') do
|
96
|
+
true
|
97
|
+
end
|
98
|
+
define_method('__re_enqueue_block') do
|
99
|
+
block
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
end # ClassMethods
|
104
|
+
|
105
|
+
end # Extras
|
106
|
+
end # Job
|
107
|
+
end # Delayed
|
@@ -0,0 +1,28 @@
|
|
1
|
+
begin
|
2
|
+
# If the hoptoad_notifier gem is available
|
3
|
+
# let's use it so we can get some good notifications
|
4
|
+
# when an exception is raised.
|
5
|
+
require 'hoptoad_notifier'
|
6
|
+
|
7
|
+
DJ::Worker.logger.info "Adding Hoptoad support to Delayed::Job"
|
8
|
+
|
9
|
+
module Delayed
|
10
|
+
class Job
|
11
|
+
include HoptoadNotifier::Catcher
|
12
|
+
|
13
|
+
def invoke_job_with_hoptoad
|
14
|
+
begin
|
15
|
+
invoke_job_without_hoptoad
|
16
|
+
rescue Exception => e
|
17
|
+
notify_hoptoad(exception_to_data(e).merge(:dj => self.inspect))
|
18
|
+
raise e
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
alias_method_chain :invoke_job, :hoptoad
|
23
|
+
|
24
|
+
end # Job
|
25
|
+
end # Delayed
|
26
|
+
|
27
|
+
rescue Exception => e
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
begin
|
2
|
+
# If the is_paranoid gem is available
|
3
|
+
# let's use it so we can have a record of the
|
4
|
+
# tasks that have been performed.
|
5
|
+
require 'is_paranoid'
|
6
|
+
|
7
|
+
DJ::Worker.logger.info "Adding is_paranoid support to Delayed::Job"
|
8
|
+
|
9
|
+
module Delayed
|
10
|
+
class Job
|
11
|
+
include HoptoadNotifier::Catcher
|
12
|
+
|
13
|
+
is_paranoid
|
14
|
+
|
15
|
+
end # Job
|
16
|
+
end # Delayed
|
17
|
+
|
18
|
+
rescue Exception => e
|
19
|
+
end
|
@@ -1,41 +1,40 @@
|
|
1
1
|
module Delayed
|
2
2
|
class Job < ActiveRecord::Base
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
4
|
+
def invoke_job_with_extras
|
5
|
+
begin
|
6
|
+
self.payload_object.dj_object = self
|
7
|
+
self.touch(:started_at)
|
8
|
+
DJ::Worker.logger.info("Starting #{self.payload_object.class.name}#perform (DJ.id = '#{self.id}')")
|
9
|
+
|
10
|
+
invoke_job_without_extras
|
11
|
+
|
12
|
+
DJ::Worker.logger.info("Completed #{self.payload_object.class.name}#perform (DJ.id = '#{self.id}') [SUCCESS]")
|
13
|
+
self.touch(:finished_at)
|
14
|
+
rescue Exception => e
|
15
|
+
DJ::Worker.logger.error("Halted #{self.payload_object.class.name}#perform (DJ.id = '#{self.id}') [FAILURE]")
|
16
|
+
self.update_attributes(:started_at => nil)
|
17
|
+
raise e
|
18
|
+
end
|
19
|
+
enqueue_again
|
20
20
|
end
|
21
21
|
|
22
|
-
alias_method_chain :invoke_job, :
|
23
|
-
|
24
|
-
def pending?
|
25
|
-
self.started_at.nil? && self.finished_at.nil?
|
26
|
-
end
|
22
|
+
alias_method_chain :invoke_job, :extras
|
27
23
|
|
28
|
-
def running?
|
29
|
-
!self.started_at.nil? && self.finished_at.nil?
|
30
|
-
end
|
31
24
|
|
32
|
-
def
|
33
|
-
|
25
|
+
def enqueue_again
|
26
|
+
if self.payload_object.re_enqueuable
|
27
|
+
new_worker = self.payload_object.class.new(*self.payload_object.__original_args)
|
28
|
+
if self.payload_object.__re_enqueue_block
|
29
|
+
self.payload_object.__re_enqueue_block.call(self.payload_object, new_worker)
|
30
|
+
end
|
31
|
+
new_worker.enqueue
|
32
|
+
end
|
34
33
|
end
|
35
34
|
|
36
35
|
def validate_with_unique
|
37
36
|
validate_without_unique
|
38
|
-
if self
|
37
|
+
if self.payload_object.respond_to?(:unique?) && self.new_record?
|
39
38
|
if self.payload_object.unique?
|
40
39
|
if Delayed::Job.count(:all, :conditions => {:worker_class_name => self.worker_class_name, :finished_at => nil}) > 0
|
41
40
|
self.errors.add_to_base("Only one #{self.worker_class_name} can be queued at a time!")
|
@@ -46,33 +45,21 @@ module Delayed
|
|
46
45
|
|
47
46
|
alias_method_chain :validate, :unique
|
48
47
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
date_stats = {:start_date => start_date, :end_date => end_date}
|
65
|
-
date_stats[:total] = Delayed::Job.count_with_destroyed(:conditions => ['worker_class_name = ? and (created_at > ? and created_at < ?)', wname, start_date, end_date])
|
66
|
-
date_stats[:remaining] = Delayed::Job.count(:conditions => ['worker_class_name = ? and (created_at > ? and created_at < ?)', wname, start_date, end_date])
|
67
|
-
date_stats[:processed] = date_stats[:total] - date_stats[:remaining]
|
68
|
-
date_stats[:failures] = Delayed::Job.count(:conditions => ['worker_class_name = ? and attempts > 1 and (created_at > ? and created_at < ?)', wname, start_date, end_date])
|
69
|
-
stats[:date_range] = date_stats
|
70
|
-
end
|
71
|
-
workers[worker] = stats
|
72
|
-
end
|
73
|
-
workers
|
74
|
-
end
|
75
|
-
|
48
|
+
def payload_object=(payload)
|
49
|
+
self.worker_class_name = payload.respond_to?(:worker_class_name) ? payload.worker_class_name : 'unknown'
|
50
|
+
self['handler'] = payload.to_yaml
|
51
|
+
end
|
52
|
+
|
53
|
+
def pending?
|
54
|
+
self.started_at.nil? && self.finished_at.nil?
|
55
|
+
end
|
56
|
+
|
57
|
+
def running?
|
58
|
+
!self.started_at.nil? && self.finished_at.nil?
|
59
|
+
end
|
60
|
+
|
61
|
+
def finished?
|
62
|
+
!self.started_at.nil? && !self.finished_at.nil?
|
76
63
|
end
|
77
64
|
|
78
65
|
end # Job
|
@@ -1,41 +1,15 @@
|
|
1
1
|
module Delayed
|
2
2
|
class PerformableMethod
|
3
|
+
include Delayed::Job::Extras
|
3
4
|
|
4
5
|
attr_accessor :worker_class_name
|
5
|
-
attr_accessor :dj_object
|
6
6
|
|
7
|
-
def
|
8
|
-
self.worker_class_name = "#{object.class}
|
9
|
-
|
7
|
+
def initialize_with_extras(object, method, args)
|
8
|
+
self.worker_class_name = "#{object.class.to_s.underscore}/#{method}"
|
9
|
+
initialize_without_extras(object, method, args)
|
10
10
|
end
|
11
11
|
|
12
|
-
alias_method_chain :initialize, :
|
13
|
-
|
14
|
-
if Object.const_defined?(:HoptoadNotifier)
|
15
|
-
include HoptoadNotifier::Catcher
|
16
|
-
|
17
|
-
def perform_with_hoptoad
|
18
|
-
dj_id = 'unknown'
|
19
|
-
if self.dj_object
|
20
|
-
dj_id = self.dj_object.id
|
21
|
-
self.dj_object.touch(:started_at)
|
22
|
-
end
|
23
|
-
begin
|
24
|
-
DJ::Worker.logger.info("Starting #{self.class.name}#perform (DJ.id = '#{dj_id}')")
|
25
|
-
val = perform_without_hoptoad
|
26
|
-
DJ::Worker.logger.info("Completed #{self.class.name}#perform (DJ.id = '#{dj_id}') [SUCCESS]")
|
27
|
-
self.dj_object.touch(:finished_at) if self.dj_object
|
28
|
-
return val
|
29
|
-
rescue Exception => e
|
30
|
-
notify_hoptoad(exception_to_data(e).merge(:dj => self.dj_object.inspect))
|
31
|
-
DJ::Worker.logger.error("Halted #{self.class.name}#perform (DJ.id = '#{dj_id}') [FAILURE]")
|
32
|
-
self.dj_object.update_attributes(:started_at => nil) if self.dj_object
|
33
|
-
raise e
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
alias_method_chain :perform, :hoptoad
|
38
|
-
end
|
12
|
+
alias_method_chain :initialize, :extras
|
39
13
|
|
40
14
|
end # PerformableMethod
|
41
15
|
end # Delayed
|
@@ -1,131 +1,6 @@
|
|
1
1
|
module DJ
|
2
2
|
class Worker
|
3
|
-
|
4
|
-
PRIORITY_LEVELS = {:immediate => 10000, :high => 1000, :medium => 500, :normal => 0, :low => -100, :who_cares => -1000}
|
5
|
-
|
6
|
-
attr_accessor :dj_object
|
7
|
-
attr_accessor :logger
|
8
|
-
attr_accessor :__original_args
|
9
|
-
|
10
|
-
def initialize(*args)
|
11
|
-
self.__original_args = *args
|
12
|
-
return self
|
13
|
-
end
|
14
|
-
|
15
|
-
def priority=(x)
|
16
|
-
@priority = x
|
17
|
-
end
|
18
|
-
|
19
|
-
def priority
|
20
|
-
return @priority ||= 0
|
21
|
-
end
|
22
|
-
|
23
|
-
def run_at=(x)
|
24
|
-
@run_at = x
|
25
|
-
end
|
26
|
-
|
27
|
-
def run_at
|
28
|
-
return @run_at ||= Time.now
|
29
|
-
end
|
30
|
-
|
31
|
-
if Object.const_defined?(:HoptoadNotifier)
|
32
|
-
include HoptoadNotifier::Catcher
|
33
|
-
else
|
34
|
-
def notify_hoptoad(e)
|
35
|
-
logger.error(e)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def worker_class_name
|
40
|
-
self.class.to_s.underscore
|
41
|
-
end
|
42
|
-
|
43
|
-
def logger
|
44
|
-
@logger || DJ::Worker.logger
|
45
|
-
end
|
46
|
-
|
47
|
-
def enqueue(priority = self.priority, run_at = self.run_at)
|
48
|
-
Delayed::Job.enqueue(self, priority, run_at)
|
49
|
-
end
|
50
|
-
|
51
|
-
def reenqueue
|
52
|
-
job = self.class.new(*self.__original_args)
|
53
|
-
yield job if block_given?
|
54
|
-
self.dj_object.touch(:finished_at) if self.dj_object
|
55
|
-
job.enqueue
|
56
|
-
end
|
57
|
-
|
58
|
-
def unique?
|
59
|
-
false
|
60
|
-
end
|
61
|
-
|
62
|
-
def before_perform
|
63
|
-
end
|
64
|
-
|
65
|
-
def after_success
|
66
|
-
end
|
67
|
-
|
68
|
-
def after_failure
|
69
|
-
end
|
70
|
-
|
71
|
-
class << self
|
72
|
-
|
73
|
-
@@logger = SplitLogger.new
|
74
|
-
|
75
|
-
def logger
|
76
|
-
@@logger
|
77
|
-
end
|
78
|
-
|
79
|
-
def logger=(logger)
|
80
|
-
@@logger = logger
|
81
|
-
end
|
82
|
-
|
83
|
-
def priority(level = 0)
|
84
|
-
define_method('priority') do
|
85
|
-
if level.is_a?(Symbol)
|
86
|
-
level = DJ::Worker::PRIORITY_LEVELS[level] ||= 0
|
87
|
-
end
|
88
|
-
return @priority ||= level
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
# VideoWorker.encode(1) # => Delayed::Job.enqueue(VideoWorker.new(:encode, 1))
|
93
|
-
def method_missing(sym, *args)
|
94
|
-
self.enqueue(sym, *args)
|
95
|
-
end
|
96
|
-
|
97
|
-
# VideoWorker.enqueue(1) # => Delayed::Job.enqueue(VideoWorker.new(1))
|
98
|
-
def enqueue(*args)
|
99
|
-
self.new(*args).enqueue
|
100
|
-
end
|
101
|
-
|
102
|
-
def perform(&block)
|
103
|
-
define_method(:perform) do
|
104
|
-
dj_id = 'unknown'
|
105
|
-
if self.dj_object
|
106
|
-
dj_id = self.dj_object.id
|
107
|
-
self.dj_object.touch(:started_at)
|
108
|
-
end
|
109
|
-
begin
|
110
|
-
self.before_perform
|
111
|
-
self.logger.info("Starting #{self.class.name}#perform (DJ.id = '#{dj_id}')")
|
112
|
-
val = self.instance_eval(&block)
|
113
|
-
self.logger.info("Completed #{self.class.name}#perform (DJ.id = '#{dj_id}') [SUCCESS]")
|
114
|
-
self.dj_object.touch(:finished_at) if self.dj_object
|
115
|
-
self.after_success
|
116
|
-
return val
|
117
|
-
rescue Exception => e
|
118
|
-
# send to hoptoad!
|
119
|
-
notify_hoptoad(exception_to_data(e).merge(:dj => self.dj_object.inspect))
|
120
|
-
self.logger.error("Halted #{self.class.name}#perform (DJ.id = '#{dj_id}') [FAILURE]")
|
121
|
-
self.dj_object.update_attributes(:started_at => nil) if self.dj_object
|
122
|
-
self.after_failure
|
123
|
-
raise e
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
end
|
3
|
+
include Delayed::Job::Extras
|
129
4
|
|
130
5
|
end # Worker
|
131
|
-
end #
|
6
|
+
end # DJ
|
data/lib/delayed_job_extras.rb
CHANGED
@@ -1,21 +1,12 @@
|
|
1
|
-
|
2
|
-
# If the hoptoad_notifier gem is available
|
3
|
-
# let's use it so we can get some good notifications
|
4
|
-
# when an exception is raised.
|
5
|
-
require 'hoptoad_notifier'
|
6
|
-
rescue Exception => e
|
7
|
-
end
|
1
|
+
require 'split_logger'
|
8
2
|
|
9
|
-
begin
|
10
|
-
# If the is_paranoid gem is available
|
11
|
-
# let's use it so we can have a record of the
|
12
|
-
# tasks that have been performed.
|
13
|
-
require 'is_paranoid'
|
14
|
-
rescue Exception => e
|
15
|
-
end
|
16
3
|
|
17
|
-
|
4
|
+
path = File.join(File.dirname(__FILE__), 'delayed_job_extras')
|
5
|
+
require File.join(path, 'extras')
|
6
|
+
require File.join(path, 'job')
|
7
|
+
require File.join(path, 'performable_method')
|
8
|
+
require File.join(path, 'worker')
|
9
|
+
require File.join(path, 'action_mailer')
|
18
10
|
|
19
|
-
|
20
|
-
|
21
|
-
end
|
11
|
+
require File.join(path, 'hoptoad')
|
12
|
+
require File.join(path, 'is_paranoid')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delayed_job_extras
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- markbates
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-04 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -32,6 +32,10 @@ extra_rdoc_files:
|
|
32
32
|
- README
|
33
33
|
- LICENSE
|
34
34
|
files:
|
35
|
+
- lib/delayed_job_extras/action_mailer.rb
|
36
|
+
- lib/delayed_job_extras/extras.rb
|
37
|
+
- lib/delayed_job_extras/hoptoad.rb
|
38
|
+
- lib/delayed_job_extras/is_paranoid.rb
|
35
39
|
- lib/delayed_job_extras/job.rb
|
36
40
|
- lib/delayed_job_extras/performable_method.rb
|
37
41
|
- lib/delayed_job_extras/worker.rb
|