blaxter-delayed_job 2.0.1 → 2.0.3
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/README.markdown +2 -0
- data/Rakefile +9 -9
- data/VERSION +1 -1
- data/delayed_job.gemspec +3 -3
- data/generators/delayed_job/templates/migration.rb +1 -1
- data/lib/delayed/job.rb +12 -6
- data/lib/delayed/worker.rb +3 -2
- metadata +18 -9
data/README.markdown
CHANGED
@@ -185,6 +185,8 @@ You can invoke `rake jobs:clear` to delete all jobs in the queue.
|
|
185
185
|
|
186
186
|
Changes
|
187
187
|
-------
|
188
|
+
* 2.0.3: The only_for feature wasn't working at all
|
189
|
+
* 2.0.2: Only update run_at when it's gonna be executed another time for sure (attempts < max_attempts)
|
188
190
|
* 2.0.1: named_scope Delayed::Job.failed/finished/unfinished (jobs that have failed, have finished ok or still haven't been done)
|
189
191
|
* 2.0.0: Contains the changes made in this fork, the ability to create workers with individual constraints without interfere to other workers
|
190
192
|
|
data/Rakefile
CHANGED
@@ -3,17 +3,17 @@ begin
|
|
3
3
|
require 'jeweler'
|
4
4
|
|
5
5
|
Jeweler::Tasks.new do |s|
|
6
|
-
s.name = "delayed_job"
|
6
|
+
s.name = "blaxter-delayed_job"
|
7
7
|
s.summary = "Database-backed asynchronous priority queue system -- Extracted from Shopify"
|
8
|
-
s.email = "
|
9
|
-
s.homepage = "http://github.com/
|
8
|
+
s.email = "blaxter@gmail.com"
|
9
|
+
s.homepage = "http://github.com/blaxter/delayed_job"
|
10
10
|
s.description = "Delayed_job (or DJ) encapsulates the common pattern of asynchronously executing longer tasks in the background. It is a direct extraction from Shopify where the job table is responsible for a multitude of core tasks."
|
11
|
-
s.authors = ["Tobias Lütke"]
|
12
|
-
|
11
|
+
s.authors = ["Tobias Lütke", "Jesús García Sáez"]
|
12
|
+
|
13
13
|
s.has_rdoc = true
|
14
14
|
s.rdoc_options = ["--main", "README.textile", "--inline-source", "--line-numbers"]
|
15
15
|
s.extra_rdoc_files = ["README.textile"]
|
16
|
-
|
16
|
+
|
17
17
|
s.test_files = Dir['spec/**/*']
|
18
18
|
end
|
19
19
|
|
@@ -27,12 +27,12 @@ Spec::Rake::SpecTask.new(:spec) do |spec|
|
|
27
27
|
spec.libs << 'lib' << 'spec'
|
28
28
|
spec.spec_files = FileList['spec/**/*_spec.rb']
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
32
32
|
spec.libs << 'lib' << 'spec'
|
33
33
|
spec.pattern = 'spec/**/*_spec.rb'
|
34
34
|
spec.rcov = true
|
35
35
|
end
|
36
|
-
|
37
|
-
|
36
|
+
|
37
|
+
|
38
38
|
task :default => :spec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.
|
1
|
+
2.0.3
|
data/delayed_job.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{delayed_job}
|
8
|
-
s.version = "2.0.
|
8
|
+
s.version = "2.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Tobias L\303\274tke"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-03-22}
|
13
13
|
s.description = %q{Delayed_job (or DJ) encapsulates the common pattern of asynchronously executing longer tasks in the background. It is a direct extraction from Shopify where the job table is responsible for a multitude of core tasks.}
|
14
14
|
s.email = %q{tobi@leetsoft.com}
|
15
15
|
s.files = [
|
@@ -37,7 +37,7 @@ Gem::Specification.new do |s|
|
|
37
37
|
s.homepage = %q{http://github.com/tobi/delayed_job/tree/master}
|
38
38
|
s.rdoc_options = ["--main", "README.textile", "--inline-source", "--line-numbers"]
|
39
39
|
s.require_paths = ["lib"]
|
40
|
-
s.rubygems_version = %q{1.3.
|
40
|
+
s.rubygems_version = %q{1.3.6}
|
41
41
|
s.summary = %q{Database-backed asynchronous priority queue system -- Extracted from Shopify}
|
42
42
|
s.test_files = [
|
43
43
|
"spec/delayed_method_spec.rb",
|
data/lib/delayed/job.rb
CHANGED
@@ -99,7 +99,11 @@ module Delayed
|
|
99
99
|
# This leads to a more even distribution of jobs across the worker processes.
|
100
100
|
find_available( options ).each do |job|
|
101
101
|
t = job.run_with_lock( max_run_time, worker_name )
|
102
|
-
|
102
|
+
if t.nil?
|
103
|
+
Delayed::Worker.logger.info "* #{worker_name} No work done."
|
104
|
+
else
|
105
|
+
return t
|
106
|
+
end
|
103
107
|
end
|
104
108
|
# we didn't do any work, all 5 were not lockable
|
105
109
|
nil
|
@@ -120,6 +124,7 @@ module Delayed
|
|
120
124
|
else
|
121
125
|
break # leave if no work could be done
|
122
126
|
end
|
127
|
+
Delayed::Worker.logger.info "#{options[:worker_name]} job done..."
|
123
128
|
break if Worker.exit # leave if we're exiting
|
124
129
|
end
|
125
130
|
|
@@ -163,11 +168,12 @@ module Delayed
|
|
163
168
|
# Reschedule the job in the future (when a job fails).
|
164
169
|
# Uses an exponential scale depending on the number of failed attempts.
|
165
170
|
def reschedule(message, backtrace = [], time = nil)
|
166
|
-
|
171
|
+
max_attempts = payload_object.send(:max_attempts) rescue MAX_ATTEMPTS
|
172
|
+
if self.attempts < max_attempts
|
167
173
|
time ||= Job.db_time_now + (attempts ** 4) + 5
|
168
174
|
|
169
175
|
self.attempts += 1
|
170
|
-
self.run_at = time
|
176
|
+
self.run_at = time unless self.attempts == max_attempts
|
171
177
|
self.last_error = message + "\n" + backtrace.join("\n")
|
172
178
|
self.unlock
|
173
179
|
save!
|
@@ -180,10 +186,10 @@ module Delayed
|
|
180
186
|
# Try to run one job.
|
181
187
|
# Returns true/false (work done/work failed) or nil if job can't be locked.
|
182
188
|
def run_with_lock(max_run_time = MAX_RUN_TIME, worker_name = Worker::DEFAULT_WORKER_NAME)
|
183
|
-
Delayed::Worker.logger.info "* [JOB] aquiring lock on #{name}"
|
189
|
+
Delayed::Worker.logger.info "* [JOB] #{worker_name} aquiring lock on #{name}"
|
184
190
|
unless lock_exclusively!(max_run_time, worker_name)
|
185
191
|
# We did not get the lock, some other worker process must have
|
186
|
-
Delayed::Worker.logger.warn "* [JOB] failed to aquire exclusive lock for #{name}"
|
192
|
+
Delayed::Worker.logger.warn "* [JOB] #{worker_name} - failed to aquire exclusive lock for #{name}"
|
187
193
|
return nil # no work done
|
188
194
|
end
|
189
195
|
|
@@ -193,7 +199,7 @@ module Delayed
|
|
193
199
|
end
|
194
200
|
destroy_successful_jobs ? destroy :
|
195
201
|
update_attribute(:finished_at, Time.now)
|
196
|
-
Delayed::Worker.logger.info "* [JOB] #{name} completed after %.4f" % runtime
|
202
|
+
Delayed::Worker.logger.info "* [JOB] #{worker_name} - #{name} completed after %.4f" % runtime
|
197
203
|
return true # did work
|
198
204
|
rescue Exception => e
|
199
205
|
reschedule e.message, e.backtrace
|
data/lib/delayed/worker.rb
CHANGED
@@ -27,7 +27,7 @@ module Delayed
|
|
27
27
|
attr_accessor :name
|
28
28
|
|
29
29
|
# Constraints for this worker, what kind of jobs is gonna execute?
|
30
|
-
attr_accessor :min_priority, :max_priority, :job_types
|
30
|
+
attr_accessor :min_priority, :max_priority, :job_types, :only_for
|
31
31
|
|
32
32
|
attr_accessor :quiet
|
33
33
|
|
@@ -41,7 +41,7 @@ module Delayed
|
|
41
41
|
# - max_priority: constraint for selecting what jobs to execute (integer)
|
42
42
|
# - job_types: constraint for selecting what jobs to execute (String or Array)
|
43
43
|
def initialize(options={})
|
44
|
-
[ :quiet, :name, :min_priority, :max_priority, :job_types ].each do |attr_name|
|
44
|
+
[ :quiet, :name, :min_priority, :max_priority, :job_types, :only_for ].each do |attr_name|
|
45
45
|
send "#{attr_name}=", options[attr_name]
|
46
46
|
end
|
47
47
|
# Default values
|
@@ -90,6 +90,7 @@ module Delayed
|
|
90
90
|
:limit => 5,
|
91
91
|
:min_priority => min_priority,
|
92
92
|
:max_priority => max_priority,
|
93
|
+
:only_for => only_for,
|
93
94
|
:job_types => job_types }
|
94
95
|
end
|
95
96
|
end
|
metadata
CHANGED
@@ -1,20 +1,26 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blaxter-delayed_job
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 2
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
version: 2.0.3
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- "Tobias L\xC3\xBCtke"
|
13
|
+
- "Jes\xC3\xBAs Garc\xC3\xADa S\xC3\xA1ez"
|
8
14
|
autorequire:
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date:
|
18
|
+
date: 2010-03-22 00:00:00 +01:00
|
13
19
|
default_executable:
|
14
20
|
dependencies: []
|
15
21
|
|
16
22
|
description: Delayed_job (or DJ) encapsulates the common pattern of asynchronously executing longer tasks in the background. It is a direct extraction from Shopify where the job table is responsible for a multitude of core tasks.
|
17
|
-
email:
|
23
|
+
email: blaxter@gmail.com
|
18
24
|
executables: []
|
19
25
|
|
20
26
|
extensions: []
|
@@ -42,9 +48,10 @@ files:
|
|
42
48
|
- spec/story_spec.rb
|
43
49
|
- tasks/jobs.rake
|
44
50
|
- tasks/tasks.rb
|
45
|
-
has_rdoc:
|
46
|
-
homepage: http://github.com/
|
47
|
-
licenses:
|
51
|
+
has_rdoc: true
|
52
|
+
homepage: http://github.com/blaxter/delayed_job
|
53
|
+
licenses: []
|
54
|
+
|
48
55
|
post_install_message:
|
49
56
|
rdoc_options:
|
50
57
|
- --main
|
@@ -57,18 +64,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
57
64
|
requirements:
|
58
65
|
- - ">="
|
59
66
|
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
60
69
|
version: "0"
|
61
|
-
version:
|
62
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
71
|
requirements:
|
64
72
|
- - ">="
|
65
73
|
- !ruby/object:Gem::Version
|
74
|
+
segments:
|
75
|
+
- 0
|
66
76
|
version: "0"
|
67
|
-
version:
|
68
77
|
requirements: []
|
69
78
|
|
70
79
|
rubyforge_project:
|
71
|
-
rubygems_version: 1.3.
|
80
|
+
rubygems_version: 1.3.6
|
72
81
|
signing_key:
|
73
82
|
specification_version: 3
|
74
83
|
summary: Database-backed asynchronous priority queue system -- Extracted from Shopify
|