topprospect-delayed_job 2.0.5 → 2.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/rails/init.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'delayed_job'
2
+
3
+ config.after_initialize do
4
+ Delayed::Worker.guess_backend
5
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: topprospect-delayed_job
3
3
  version: !ruby/object:Gem::Version
4
- hash: 5
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 2
8
8
  - 0
9
- - 5
10
- version: 2.0.5
9
+ - 6
10
+ version: 2.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Chris Gaffney
@@ -217,9 +217,7 @@ files:
217
217
  - lib/delayed/railtie.rb
218
218
  - lib/delayed/recipes.rb
219
219
  - lib/delayed/tasks.rb
220
- - lib/delayed/tasks.rb.orig
221
220
  - lib/delayed/worker.rb
222
- - lib/delayed/worker.rb.orig
223
221
  - lib/delayed/yaml_ext.rb
224
222
  - lib/delayed_job.rb
225
223
  - lib/generators/delayed_job/delayed_job_generator.rb
@@ -242,10 +240,11 @@ files:
242
240
  - spec/setup/mongo_mapper.rb
243
241
  - spec/spec_helper.rb
244
242
  - spec/worker_spec.rb
243
+ - rails/init.rb
245
244
  - MIT-LICENSE
246
245
  - README.textile
247
246
  has_rdoc: true
248
- homepage: http://github.com/collectiveidea/delayed_job
247
+ homepage: http://github.com/topprospect/delayed_job
249
248
  licenses: []
250
249
 
251
250
  post_install_message:
@@ -280,7 +279,7 @@ rubyforge_project:
280
279
  rubygems_version: 1.5.2
281
280
  signing_key:
282
281
  specification_version: 3
283
- summary: Database-backed asynchronous priority queue system -- Extracted from Shopify
282
+ summary: Database-backed asynchronous priority queue system -- Extracted from Shopify. TopProspect improvements include named queues, bundler, and more
284
283
  test_files:
285
284
  - spec/autoloaded/clazz.rb
286
285
  - spec/autoloaded/struct.rb
@@ -1,26 +0,0 @@
1
- # Re-definitions are appended to existing tasks
2
- task :environment
3
- task :merb_env
4
-
5
- namespace :jobs do
6
- desc "Clear the delayed_job queue."
7
- task :clear => [:merb_env, :environment] do
8
- Delayed::Job.delete_all
9
- end
10
-
11
- <<<<<<< HEAD
12
- desc "Start a delayed_job worker with an optional log name"
13
- task :work, [:logname] => [:merb_env, :environment] do |_, args|
14
-
15
- Delayed::Worker.new(:min_priority => ENV['MIN_PRIORITY'],
16
- :max_priority => ENV['MAX_PRIORITY'],
17
- :queue => ENV['QUEUE'],
18
- :logname => args.logname
19
- ).start
20
- =======
21
- desc "Start a delayed_job worker."
22
- task :work => [:merb_env, :environment] do
23
- Delayed::Worker.new(:min_priority => ENV['MIN_PRIORITY'], :max_priority => ENV['MAX_PRIORITY'], :queue => ENV['QUEUE']).start
24
- >>>>>>> 75b6e0c... added queues from the original topprospect patch, added tests for queues
25
- end
26
- end
@@ -1,202 +0,0 @@
1
- require 'timeout'
2
- require 'active_support/core_ext/numeric/time'
3
- require 'active_support/core_ext/class/attribute_accessors'
4
- require 'active_support/core_ext/kernel'
5
-
6
- module Delayed
7
- DEFAULT_QUEUE = ''
8
-
9
- class Worker
10
- cattr_accessor :min_priority, :max_priority, :max_attempts, :max_run_time, :default_priority, :sleep_delay, :logger, :queue
11
- self.sleep_delay = 5
12
- self.max_attempts = 25
13
- self.max_run_time = 4.hours
14
- self.default_priority = 0
15
- self.queue = Delayed::DEFAULT_QUEUE
16
-
17
- # By default failed jobs are destroyed after too many attempts. If you want to keep them around
18
- # (perhaps to inspect the reason for the failure), set this to false.
19
- cattr_accessor :destroy_failed_jobs
20
- self.destroy_failed_jobs = true
21
-
22
- self.logger = if defined?(Merb::Logger)
23
- Merb.logger
24
- elsif defined?(RAILS_DEFAULT_LOGGER)
25
- RAILS_DEFAULT_LOGGER
26
- end
27
-
28
- # name_prefix is ignored if name is set directly
29
- attr_accessor :name_prefix
30
-
31
- cattr_reader :backend
32
-
33
- def self.backend=(backend)
34
- if backend.is_a? Symbol
35
- require "delayed/backend/#{backend}"
36
- backend = "Delayed::Backend::#{backend.to_s.classify}::Job".constantize
37
- end
38
- @@backend = backend
39
- silence_warnings { ::Delayed.const_set(:Job, backend) }
40
- end
41
-
42
- def self.guess_backend
43
- self.backend ||= if defined?(ActiveRecord)
44
- :active_record
45
- elsif defined?(MongoMapper)
46
- :mongo_mapper
47
- else
48
- logger.warn "Could not decide on a backend, defaulting to active_record"
49
- :active_record
50
- end
51
- end
52
-
53
- def initialize(options={})
54
- @quiet = options[:quiet]
55
- self.class.min_priority = options[:min_priority] if options.has_key?(:min_priority)
56
- self.class.max_priority = options[:max_priority] if options.has_key?(:max_priority)
57
- <<<<<<< HEAD
58
- self.class.queue = options[:queue] || Delayed::DEFAULT_QUEUE
59
- # renaming the log file works like this only when using RAILS_DEFAULT_LOGGER:
60
- rename_default_rails_log_if_given(options[:logname])
61
- =======
62
- self.class.sleep_delay = options[:sleep_delay] if options.has_key?(:sleep_delay)
63
- self.class.queue = options[:queue] || Delayed::DEFAULT_QUEUE
64
- >>>>>>> 75b6e0c... added queues from the original topprospect patch, added tests for queues
65
- end
66
-
67
- # Every worker has a unique name which by default is the pid of the process. There are some
68
- # advantages to overriding this with something which survives worker retarts: Workers can#
69
- # safely resume working on tasks which are locked by themselves. The worker will assume that
70
- # it crashed before.
71
- def name
72
- return @name unless @name.nil?
73
- "#{@name_prefix}host:#{Socket.gethostname} pid:#{Process.pid}" rescue "#{@name_prefix}pid:#{Process.pid}"
74
- end
75
-
76
- # Sets the name of the worker.
77
- # Setting the name to nil will reset the default worker name
78
- def name=(val)
79
- @name = val
80
- end
81
-
82
- def start
83
- say "Starting job worker"
84
-
85
- trap('TERM') { say 'Exiting...'; $exit = true }
86
- trap('INT') { say 'Exiting...'; $exit = true }
87
-
88
- loop do
89
- result = nil
90
-
91
- realtime = Benchmark.realtime do
92
- result = work_off
93
- end
94
-
95
- count = result.sum
96
-
97
- break if $exit
98
-
99
- if count.zero?
100
- sleep(@@sleep_delay)
101
- else
102
- say "#{count} jobs processed at %.4f j/s, %d failed ..." % [count / realtime, result.last]
103
- end
104
-
105
- break if $exit
106
- end
107
-
108
- ensure
109
- Delayed::Job.clear_locks!(name)
110
- end
111
-
112
- # Do num jobs and return stats on success/failure.
113
- # Exit early if interrupted.
114
- def work_off(num = 100)
115
- success, failure = 0, 0
116
-
117
- num.times do
118
- case reserve_and_run_one_job
119
- when true
120
- success += 1
121
- when false
122
- failure += 1
123
- else
124
- break # leave if no work could be done
125
- end
126
- break if $exit # leave if we're exiting
127
- end
128
-
129
- return [success, failure]
130
- end
131
-
132
- def run(job)
133
- runtime = Benchmark.realtime do
134
- Timeout.timeout(self.class.max_run_time.to_i) { job.invoke_job }
135
- job.destroy
136
- end
137
- say "#{job.name} completed after %.4f" % runtime
138
- return true # did work
139
- rescue Exception => e
140
- handle_failed_job(job, e)
141
- return false # work failed
142
- end
143
-
144
- # Reschedule the job in the future (when a job fails).
145
- # Uses an exponential scale depending on the number of failed attempts.
146
- def reschedule(job, time = nil)
147
- if (job.attempts += 1) < self.class.max_attempts
148
- time ||= Job.db_time_now + (job.attempts ** 4) + 5
149
- job.run_at = time
150
- job.unlock
151
- job.save!
152
- else
153
- say "PERMANENTLY removing #{job.name} because of #{job.attempts} consecutive failures.", Logger::INFO
154
-
155
- if job.payload_object.respond_to? :on_permanent_failure
156
- say "Running on_permanent_failure hook"
157
- failure_method = job.payload_object.method(:on_permanent_failure)
158
- if failure_method.arity == 1
159
- failure_method.call(job)
160
- else
161
- failure_method.call
162
- end
163
- end
164
-
165
- self.class.destroy_failed_jobs ? job.destroy : job.update_attributes(:failed_at => Delayed::Job.db_time_now)
166
- end
167
- end
168
-
169
- def say(text, level = Logger::INFO)
170
- text = "[Worker(#{name})] #{text}"
171
- puts text unless @quiet
172
- logger.add level, "#{Time.now.strftime('%FT%T%z')}: #{text}" if logger
173
- end
174
-
175
- protected
176
-
177
- def handle_failed_job(job, error)
178
- job.last_error = error.message + "\n" + error.backtrace.join("\n")
179
- say "#{job.name} failed with #{error.class.name}: #{error.message} - #{job.attempts} failed attempts", Logger::ERROR
180
- reschedule(job)
181
- end
182
-
183
- # Run the next job we can get an exclusive lock on.
184
- # If no jobs are left we return nil
185
- def reserve_and_run_one_job
186
-
187
- # We get up to 5 jobs from the db. In case we cannot get exclusive access to a job we try the next.
188
- # this leads to a more even distribution of jobs across the worker processes
189
- job = Delayed::Job.find_available(name, 5, self.class.max_run_time).detect do |job|
190
- if job.lock_exclusively!(self.class.max_run_time, name)
191
- say "acquired lock on #{job.name}"
192
- true
193
- else
194
- say "failed to acquire exclusive lock for #{job.name}", Logger::WARN
195
- false
196
- end
197
- end
198
-
199
- run(job) if job
200
- end
201
- end
202
- end