resque_ui 3.1.7 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -22,8 +22,10 @@ module Resque
22
22
 
23
23
  alias_method :id, :to_s
24
24
 
25
- def pid
26
- to_s.split(':').second
25
+ # When the worker gets the -USR2 signal, to_s may give a different value for the thread and queue portion
26
+ def pause_key
27
+ key = to_s.split(':')
28
+ "worker:#{key.first}:#{key.second}:all_workers:paused"
27
29
  end
28
30
 
29
31
  def thread
@@ -76,6 +78,35 @@ module Resque
76
78
  @shutdown = true
77
79
  end
78
80
 
81
+ def paused
82
+ redis.get pause_key
83
+ end
84
+
85
+ # are we paused?
86
+ # OVERRIDE so UI can tell if we're paused
87
+ def paused?
88
+ @paused || paused.present?
89
+ end
90
+
91
+ # Stop processing jobs after the current one has completed (if we're
92
+ # currently running one).
93
+ #OVERRIDE to set a redis key so UI knows it's paused too
94
+ # Would prefer to call super but get no superclass method error
95
+ def pause_processing
96
+ log "USR2 received; pausing job processing"
97
+ @paused = true
98
+ redis.set(pause_key, Time.now.to_s)
99
+ end
100
+
101
+ # Start processing jobs again after a pause
102
+ #OVERRIDE to set remove redis key so UI knows it's unpaused too
103
+ # Would prefer to call super but get no superclass method error
104
+ def unpause_processing
105
+ log "CONT received; resuming job processing"
106
+ @paused = false
107
+ redis.del(pause_key)
108
+ end
109
+
79
110
  # Looks for any workers which should be running on this server
80
111
  # and, if they're not, removes them from Redis.
81
112
  #
@@ -96,6 +127,29 @@ module Resque
96
127
  end
97
128
  end
98
129
 
130
+ # Unregisters ourself as a worker. Useful when shutting down.
131
+ # OVERRIDE to also remove the pause key
132
+ # Would prefer to call super but get no superclass method error
133
+ def unregister_worker
134
+ # If we're still processing a job, make sure it gets logged as a
135
+ # failure.
136
+ if (hash = processing) && !hash.empty?
137
+ job = Job.new(hash['queue'], hash['payload'])
138
+ # Ensure the proper worker is attached to this job, even if
139
+ # it's not the precise instance that died.
140
+ job.worker = self
141
+ job.fail(DirtyExit.new)
142
+ end
143
+
144
+ redis.srem(:workers, self)
145
+ redis.del("worker:#{self}")
146
+ redis.del("worker:#{self}:started")
147
+ redis.del(pause_key)
148
+
149
+ Stat.clear("processed:#{self}")
150
+ Stat.clear("failed:#{self}")
151
+ end
152
+
99
153
  def all_workers_in_pid_working
100
154
  workers_in_pid.select { |w| (hash = w.processing) && !hash.empty? }
101
155
  end
@@ -168,14 +222,6 @@ module Resque
168
222
  end.compact
169
223
  end
170
224
 
171
- # Returns an array of string pids of all the other workers on this
172
- # machine. Useful when pruning dead workers on startup.
173
- def worker_pids
174
- `ps -A -o pid,command | grep [r]esque`.split("\n").map do |line|
175
- line.split(' ')[0]
176
- end
177
- end
178
-
179
225
  def status=(status)
180
226
  data = encode(job.merge('status' => status))
181
227
  redis.set("worker:#{self}", data)
@@ -208,6 +254,22 @@ module Resque
208
254
  end
209
255
  end
210
256
 
257
+ def pause
258
+ if Rails.env =~ /development|test/
259
+ system("kill -USR2 #{self.pid}")
260
+ else
261
+ system("cd #{Rails.root}; #{ResqueUi::Cap.path} #{Rails.env} resque:pause_worker pid=#{self.pid} host=#{self.ip}")
262
+ end
263
+ end
264
+
265
+ def continue
266
+ if Rails.env =~ /development|test/
267
+ system("kill -CONT #{self.pid}")
268
+ else
269
+ system("cd #{Rails.root}; #{ResqueUi::Cap.path} #{Rails.env} resque:continue_worker pid=#{self.pid} host=#{self.ip}")
270
+ end
271
+ end
272
+
211
273
  def restart
212
274
  queues = self.queues_in_pid.join('#')
213
275
  quit
@@ -1,5 +1,8 @@
1
1
  module Resque
2
2
  class JobWithStatus
3
+
4
+ attr_reader :worker
5
+
3
6
  # Adds a job of type <tt>klass<tt> to the queue with <tt>options<tt>.
4
7
  # Returns the UUID of the job
5
8
  # override to pass actual parameters instead of a single hash, to make backward compatible with existing resque jobs.
@@ -16,6 +19,47 @@ module Resque
16
19
  def tick(*messages)
17
20
  kill! if should_kill? || status.killed?
18
21
  set_status({'status' => 'working'}, *messages)
22
+ # check to see if the worker doing the job has been paused, pause the job if so
23
+ if self.worker && self.worker.paused?
24
+ loop do
25
+ # Set the status to paused.
26
+ # May need to do this repeatedly because there could be workers in a chained job still doing work.
27
+ pause! unless status.paused?
28
+ break unless self.worker.paused?
29
+ sleep 60
30
+ end
31
+ set_status({'status' => 'working'}, *messages) unless status && (status.completed? || status.paused? || status.killed?)
32
+ end
33
+ end
34
+
35
+ # Pause the current job, setting the status to 'paused'
36
+ def pause!
37
+ set_status({
38
+ 'status' => 'paused',
39
+ 'message' => "#{worker} paused at #{Time.now}"
40
+ })
41
+ end
42
+
43
+ # Create a new instance with <tt>uuid</tt> and <tt>options</tt>
44
+ # OVERRIDE to add the worker attr
45
+ def initialize(uuid, worker, options = {})
46
+ @uuid = uuid
47
+ @options = options
48
+ @worker = worker
49
+ end
50
+
51
+ # This is the method called by Resque::Worker when processing jobs. It
52
+ # creates a new instance of the job class and populates it with the uuid and
53
+ # options.
54
+ #
55
+ # You should not override this method, rather the <tt>perform</tt> instance method.
56
+ # OVERRIDE to pass the block in order to set the worker status, returns the worker object
57
+ def self.perform(uuid=nil, options = {})
58
+ uuid ||= Resque::Status.generate_uuid
59
+ worker = yield
60
+ instance = new(uuid, worker, options)
61
+ instance.safe_perform! { |status| yield status if block_given? }
62
+ instance
19
63
  end
20
64
 
21
65
  # Run by the Resque::Worker when processing this job. It wraps the <tt>perform</tt>
@@ -25,7 +69,7 @@ module Resque
25
69
  def safe_perform!
26
70
  unless should_kill? || (status && status.killed?)
27
71
  set_status({'status' => 'working'})
28
- perform
72
+ perform { |status| yield status if block_given? }
29
73
  kill! if should_kill?
30
74
  completed unless status && status.completed?
31
75
  on_success if respond_to?(:on_success)
@@ -1,5 +1,10 @@
1
1
  module Resque
2
2
  class Status
3
+ # The STATUSES constant is frozen, so we'll just manually add the paused? method here
4
+ def paused?
5
+ self['status'] === 'paused'
6
+ end
7
+
3
8
  # Return the <tt>num</tt> most recent status/job UUIDs in reverse chronological order.
4
9
  #override the gem to fix the ordering
5
10
  def self.status_ids(range_start = nil, range_end = nil)
data/rdoc/Resque/Job.html CHANGED
@@ -163,16 +163,80 @@
163
163
 
164
164
  <p>Attempts to perform the work represented by this job instance. Calls <a
165
165
  href="Job.html#method-i-perform">perform</a> on the class given in the
166
- payload with the arguments given in the payload. The worker is passed in so
167
- the status can be set for the UI to display.</p>
166
+ payload with the arguments given in the payload. A block is sent so a
167
+ message can be yielded back to be set in the worker.</p>
168
168
 
169
169
 
170
170
 
171
171
  <div class="method-source-code" id="perform-source">
172
172
  <pre>
173
- <span class="ruby-comment"># File lib/resque_ui/overrides/resque/job.rb, line 7</span>
173
+ <span class="ruby-comment"># File lib/resque_ui/overrides/resque/job.rb, line 8</span>
174
174
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">perform</span>
175
- <span class="ruby-identifier">args</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">payload_class</span>.<span class="ruby-identifier">perform</span>(*<span class="ruby-identifier">args</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">status</span><span class="ruby-operator">|</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">worker</span>.<span class="ruby-identifier">status</span> = <span class="ruby-identifier">status</span> } <span class="ruby-operator">:</span> <span class="ruby-identifier">payload_class</span>.<span class="ruby-identifier">perform</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">status</span><span class="ruby-operator">|</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">worker</span>.<span class="ruby-identifier">status</span> = <span class="ruby-identifier">status</span> }
175
+ <span class="ruby-identifier">job</span> = <span class="ruby-identifier">payload_class</span>
176
+ <span class="ruby-identifier">job_args</span> = <span class="ruby-identifier">args</span> <span class="ruby-operator">||</span> []
177
+ <span class="ruby-identifier">job_was_performed</span> = <span class="ruby-keyword">false</span>
178
+
179
+ <span class="ruby-identifier">before_hooks</span> = <span class="ruby-constant">Plugin</span>.<span class="ruby-identifier">before_hooks</span>(<span class="ruby-identifier">job</span>)
180
+ <span class="ruby-identifier">around_hooks</span> = <span class="ruby-constant">Plugin</span>.<span class="ruby-identifier">around_hooks</span>(<span class="ruby-identifier">job</span>)
181
+ <span class="ruby-identifier">after_hooks</span> = <span class="ruby-constant">Plugin</span>.<span class="ruby-identifier">after_hooks</span>(<span class="ruby-identifier">job</span>)
182
+ <span class="ruby-identifier">failure_hooks</span> = <span class="ruby-constant">Plugin</span>.<span class="ruby-identifier">failure_hooks</span>(<span class="ruby-identifier">job</span>)
183
+
184
+ <span class="ruby-keyword">begin</span>
185
+ <span class="ruby-comment"># Execute before_perform hook. Abort the job gracefully if</span>
186
+ <span class="ruby-comment"># Resque::DontPerform is raised.</span>
187
+ <span class="ruby-keyword">begin</span>
188
+ <span class="ruby-identifier">before_hooks</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">hook</span><span class="ruby-operator">|</span>
189
+ <span class="ruby-identifier">job</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">hook</span>, *<span class="ruby-identifier">job_args</span>)
190
+ <span class="ruby-keyword">end</span>
191
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">DontPerform</span>
192
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span>
193
+ <span class="ruby-keyword">end</span>
194
+
195
+ <span class="ruby-comment"># Execute the job. Do it in an around_perform hook if available.</span>
196
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">around_hooks</span>.<span class="ruby-identifier">empty?</span>
197
+ <span class="ruby-identifier">job</span>.<span class="ruby-identifier">perform</span>(*<span class="ruby-identifier">job_args</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">status</span><span class="ruby-operator">|</span>
198
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">worker</span>.<span class="ruby-identifier">status</span> = <span class="ruby-identifier">status</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">status</span>.<span class="ruby-identifier">present?</span>
199
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">worker</span>
200
+ <span class="ruby-keyword">end</span>
201
+ <span class="ruby-identifier">job_was_performed</span> = <span class="ruby-keyword">true</span>
202
+ <span class="ruby-keyword">else</span>
203
+ <span class="ruby-comment"># We want to nest all around_perform plugins, with the last one</span>
204
+ <span class="ruby-comment"># finally calling perform</span>
205
+ <span class="ruby-identifier">stack</span> = <span class="ruby-identifier">around_hooks</span>.<span class="ruby-identifier">reverse</span>.<span class="ruby-identifier">inject</span>(<span class="ruby-keyword">nil</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">last_hook</span>, <span class="ruby-identifier">hook</span><span class="ruby-operator">|</span>
206
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">last_hook</span>
207
+ <span class="ruby-identifier">lambda</span> <span class="ruby-keyword">do</span>
208
+ <span class="ruby-identifier">job</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">hook</span>, *<span class="ruby-identifier">job_args</span>) { <span class="ruby-identifier">last_hook</span>.<span class="ruby-identifier">call</span> }
209
+ <span class="ruby-keyword">end</span>
210
+ <span class="ruby-keyword">else</span>
211
+ <span class="ruby-identifier">lambda</span> <span class="ruby-keyword">do</span>
212
+ <span class="ruby-identifier">job</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">hook</span>, *<span class="ruby-identifier">job_args</span>) <span class="ruby-keyword">do</span>
213
+ <span class="ruby-identifier">result</span> = <span class="ruby-identifier">job</span>.<span class="ruby-identifier">perform</span>(*<span class="ruby-identifier">job_args</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">status</span><span class="ruby-operator">|</span>
214
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">worker</span>.<span class="ruby-identifier">status</span> = <span class="ruby-identifier">status</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">status</span>.<span class="ruby-identifier">present?</span>
215
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">worker</span>
216
+ <span class="ruby-keyword">end</span>
217
+ <span class="ruby-identifier">job_was_performed</span> = <span class="ruby-keyword">true</span>
218
+ <span class="ruby-identifier">result</span>
219
+ <span class="ruby-keyword">end</span>
220
+ <span class="ruby-keyword">end</span>
221
+ <span class="ruby-keyword">end</span>
222
+ <span class="ruby-keyword">end</span>
223
+ <span class="ruby-identifier">stack</span>.<span class="ruby-identifier">call</span>
224
+ <span class="ruby-keyword">end</span>
225
+
226
+ <span class="ruby-comment"># Execute after_perform hook</span>
227
+ <span class="ruby-identifier">after_hooks</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">hook</span><span class="ruby-operator">|</span>
228
+ <span class="ruby-identifier">job</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">hook</span>, *<span class="ruby-identifier">job_args</span>)
229
+ <span class="ruby-keyword">end</span>
230
+
231
+ <span class="ruby-comment"># Return true if the job was performed</span>
232
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">job_was_performed</span>
233
+
234
+ <span class="ruby-comment"># If an exception occurs during the job execution, look for an</span>
235
+ <span class="ruby-comment"># on_failure hook then re-raise.</span>
236
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">Object</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
237
+ <span class="ruby-identifier">failure_hooks</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">hook</span><span class="ruby-operator">|</span> <span class="ruby-identifier">job</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">hook</span>, <span class="ruby-identifier">e</span>, *<span class="ruby-identifier">job_args</span>) }
238
+ <span class="ruby-identifier">raise</span> <span class="ruby-identifier">e</span>
239
+ <span class="ruby-keyword">end</span>
176
240
  <span class="ruby-keyword">end</span></pre>
177
241
  </div><!-- perform-source -->
178
242
 
@@ -67,12 +67,18 @@
67
67
 
68
68
  <li><a href="#method-c-enqueue">::enqueue</a></li>
69
69
 
70
+ <li><a href="#method-c-new">::new</a></li>
71
+
72
+ <li><a href="#method-c-perform">::perform</a></li>
73
+
70
74
  <li><a href="#method-i-counter">#counter</a></li>
71
75
 
72
76
  <li><a href="#method-i-incr_counter">#incr_counter</a></li>
73
77
 
74
78
  <li><a href="#method-i-name">#name</a></li>
75
79
 
80
+ <li><a href="#method-i-pause-21">#pause!</a></li>
81
+
76
82
  <li><a href="#method-i-safe_perform-21">#safe_perform!</a></li>
77
83
 
78
84
  <li><a href="#method-i-tick">#tick</a></li>
@@ -151,6 +157,28 @@
151
157
 
152
158
 
153
159
 
160
+ <!-- Attributes -->
161
+ <div id="attribute-method-details" class="method-section section">
162
+ <h3 class="section-header">Attributes</h3>
163
+
164
+
165
+ <div id="worker-attribute-method" class="method-detail">
166
+ <a name="worker"></a>
167
+
168
+ <div class="method-heading attribute-method-heading">
169
+ <span class="method-name">worker</span><span
170
+ class="attribute-access-type">[R]</span>
171
+ </div>
172
+
173
+ <div class="method-description">
174
+
175
+
176
+
177
+ </div>
178
+ </div>
179
+
180
+ </div><!-- attribute-method-details -->
181
+
154
182
 
155
183
  <!-- Methods -->
156
184
 
@@ -180,7 +208,7 @@ with existing resque jobs.</p>
180
208
 
181
209
  <div class="method-source-code" id="enqueue-source">
182
210
  <pre>
183
- <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 6</span>
211
+ <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 9</span>
184
212
  <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">enqueue</span>(<span class="ruby-identifier">klass</span>, <span class="ruby-identifier">options</span> = {})
185
213
  <span class="ruby-identifier">uuid</span> = <span class="ruby-constant">Resque</span><span class="ruby-operator">::</span><span class="ruby-constant">Status</span>.<span class="ruby-identifier">create</span> <span class="ruby-value">:name</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-node">&quot;#{self.name}: #{options.inspect}&quot;</span>
186
214
  <span class="ruby-constant">Resque</span>.<span class="ruby-identifier">enqueue</span>(<span class="ruby-identifier">klass</span>, <span class="ruby-identifier">uuid</span>, <span class="ruby-identifier">options</span>)
@@ -196,6 +224,85 @@ with existing resque jobs.</p>
196
224
  </div><!-- enqueue-method -->
197
225
 
198
226
 
227
+ <div id="new-method" class="method-detail ">
228
+ <a name="method-c-new"></a>
229
+
230
+
231
+ <div class="method-heading">
232
+ <span class="method-name">new</span><span
233
+ class="method-args">(uuid, worker, options = {})</span>
234
+ <span class="method-click-advice">click to toggle source</span>
235
+ </div>
236
+
237
+
238
+ <div class="method-description">
239
+
240
+ <p>Create a new instance with <tt>uuid</tt> and <tt>options</tt> OVERRIDE to
241
+ add the worker attr</p>
242
+
243
+
244
+
245
+ <div class="method-source-code" id="new-source">
246
+ <pre>
247
+ <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 45</span>
248
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">uuid</span>, <span class="ruby-identifier">worker</span>, <span class="ruby-identifier">options</span> = {})
249
+ <span class="ruby-ivar">@uuid</span> = <span class="ruby-identifier">uuid</span>
250
+ <span class="ruby-ivar">@options</span> = <span class="ruby-identifier">options</span>
251
+ <span class="ruby-ivar">@worker</span> = <span class="ruby-identifier">worker</span>
252
+ <span class="ruby-keyword">end</span></pre>
253
+ </div><!-- new-source -->
254
+
255
+ </div>
256
+
257
+
258
+
259
+
260
+ </div><!-- new-method -->
261
+
262
+
263
+ <div id="perform-method" class="method-detail ">
264
+ <a name="method-c-perform"></a>
265
+
266
+
267
+ <div class="method-heading">
268
+ <span class="method-name">perform</span><span
269
+ class="method-args">(uuid=nil, options = {})</span>
270
+ <span class="method-click-advice">click to toggle source</span>
271
+ </div>
272
+
273
+
274
+ <div class="method-description">
275
+
276
+ <p>This is the method called by <a href="Worker.html">Resque::Worker</a> when
277
+ processing jobs. It creates a new instance of the job class and populates
278
+ it with the uuid and options.</p>
279
+
280
+ <p>You should not override this method, rather the <tt>perform</tt> instance
281
+ method. OVERRIDE to pass the block in order to set the worker status,
282
+ returns the worker object</p>
283
+
284
+
285
+
286
+ <div class="method-source-code" id="perform-source">
287
+ <pre>
288
+ <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 57</span>
289
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">perform</span>(<span class="ruby-identifier">uuid</span>=<span class="ruby-keyword">nil</span>, <span class="ruby-identifier">options</span> = {})
290
+ <span class="ruby-identifier">uuid</span> <span class="ruby-operator">||=</span> <span class="ruby-constant">Resque</span><span class="ruby-operator">::</span><span class="ruby-constant">Status</span>.<span class="ruby-identifier">generate_uuid</span>
291
+ <span class="ruby-identifier">worker</span> = <span class="ruby-keyword">yield</span>
292
+ <span class="ruby-identifier">instance</span> = <span class="ruby-identifier">new</span>(<span class="ruby-identifier">uuid</span>, <span class="ruby-identifier">worker</span>, <span class="ruby-identifier">options</span>)
293
+ <span class="ruby-identifier">instance</span>.<span class="ruby-identifier">safe_perform!</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">status</span><span class="ruby-operator">|</span> <span class="ruby-keyword">yield</span> <span class="ruby-identifier">status</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">block_given?</span> }
294
+ <span class="ruby-identifier">instance</span>
295
+ <span class="ruby-keyword">end</span></pre>
296
+ </div><!-- perform-source -->
297
+
298
+ </div>
299
+
300
+
301
+
302
+
303
+ </div><!-- perform-method -->
304
+
305
+
199
306
  </div><!-- public-class-method-details -->
200
307
 
201
308
  <div id="public-instance-method-details" class="method-section section">
@@ -221,7 +328,7 @@ with existing resque jobs.</p>
221
328
 
222
329
  <div class="method-source-code" id="counter-source">
223
330
  <pre>
224
- <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 55</span>
331
+ <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 99</span>
225
332
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">counter</span>(<span class="ruby-identifier">counter</span>)
226
333
  <span class="ruby-constant">Resque</span><span class="ruby-operator">::</span><span class="ruby-constant">Status</span>.<span class="ruby-identifier">counter</span>(<span class="ruby-identifier">counter</span>, <span class="ruby-identifier">uuid</span>)
227
334
  <span class="ruby-keyword">end</span></pre>
@@ -254,7 +361,7 @@ with existing resque jobs.</p>
254
361
 
255
362
  <div class="method-source-code" id="incr_counter-source">
256
363
  <pre>
257
- <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 51</span>
364
+ <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 95</span>
258
365
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">incr_counter</span>(<span class="ruby-identifier">counter</span>)
259
366
  <span class="ruby-constant">Resque</span><span class="ruby-operator">::</span><span class="ruby-constant">Status</span>.<span class="ruby-identifier">incr_counter</span>(<span class="ruby-identifier">counter</span>, <span class="ruby-identifier">uuid</span>)
260
367
  <span class="ruby-keyword">end</span></pre>
@@ -287,7 +394,7 @@ with existing resque jobs.</p>
287
394
 
288
395
  <div class="method-source-code" id="name-source">
289
396
  <pre>
290
- <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 47</span>
397
+ <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 91</span>
291
398
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">name</span>
292
399
  <span class="ruby-node">&quot;#{self.class.name}: #{options.inspect}&quot;</span>
293
400
  <span class="ruby-keyword">end</span></pre>
@@ -301,6 +408,42 @@ with existing resque jobs.</p>
301
408
  </div><!-- name-method -->
302
409
 
303
410
 
411
+ <div id="pause-21-method" class="method-detail ">
412
+ <a name="method-i-pause-21"></a>
413
+
414
+
415
+ <div class="method-heading">
416
+ <span class="method-name">pause!</span><span
417
+ class="method-args">()</span>
418
+ <span class="method-click-advice">click to toggle source</span>
419
+ </div>
420
+
421
+
422
+ <div class="method-description">
423
+
424
+ <p>Pause the current job, setting the status to ‘paused’</p>
425
+
426
+
427
+
428
+ <div class="method-source-code" id="pause-21-source">
429
+ <pre>
430
+ <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 36</span>
431
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">pause!</span>
432
+ <span class="ruby-identifier">set_status</span>({
433
+ <span class="ruby-string">'status'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">'paused'</span>,
434
+ <span class="ruby-string">'message'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-node">&quot;#{worker} paused at #{Time.now}&quot;</span>
435
+ })
436
+ <span class="ruby-keyword">end</span></pre>
437
+ </div><!-- pause-21-source -->
438
+
439
+ </div>
440
+
441
+
442
+
443
+
444
+ </div><!-- pause-21-method -->
445
+
446
+
304
447
  <div id="safe_perform-21-method" class="method-detail ">
305
448
  <a name="method-i-safe_perform-21"></a>
306
449
 
@@ -323,11 +466,11 @@ work, it will set the status as failed and re-raise the error.</p>
323
466
 
324
467
  <div class="method-source-code" id="safe_perform-21-source">
325
468
  <pre>
326
- <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 25</span>
469
+ <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 69</span>
327
470
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">safe_perform!</span>
328
471
  <span class="ruby-keyword">unless</span> <span class="ruby-identifier">should_kill?</span> <span class="ruby-operator">||</span> (<span class="ruby-identifier">status</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">status</span>.<span class="ruby-identifier">killed?</span>)
329
472
  <span class="ruby-identifier">set_status</span>({<span class="ruby-string">'status'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">'working'</span>})
330
- <span class="ruby-identifier">perform</span>
473
+ <span class="ruby-identifier">perform</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">status</span><span class="ruby-operator">|</span> <span class="ruby-keyword">yield</span> <span class="ruby-identifier">status</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">block_given?</span> }
331
474
  <span class="ruby-identifier">kill!</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">should_kill?</span>
332
475
  <span class="ruby-identifier">completed</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">status</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">status</span>.<span class="ruby-identifier">completed?</span>
333
476
  <span class="ruby-identifier">on_success</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">respond_to?</span>(<span class="ruby-value">:on_success</span>)
@@ -377,10 +520,21 @@ This will kill the job if it has been added to the kill list with
377
520
 
378
521
  <div class="method-source-code" id="tick-source">
379
522
  <pre>
380
- <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 16</span>
523
+ <span class="ruby-comment"># File lib/resque_ui/overrides/resque_status/job_with_status.rb, line 19</span>
381
524
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">tick</span>(*<span class="ruby-identifier">messages</span>)
382
525
  <span class="ruby-identifier">kill!</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">should_kill?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">status</span>.<span class="ruby-identifier">killed?</span>
383
526
  <span class="ruby-identifier">set_status</span>({<span class="ruby-string">'status'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">'working'</span>}, *<span class="ruby-identifier">messages</span>)
527
+ <span class="ruby-comment"># check to see if the worker doing the job has been paused, pause the job if so</span>
528
+ <span class="ruby-keyword">if</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">worker</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">worker</span>.<span class="ruby-identifier">paused?</span>
529
+ <span class="ruby-identifier">loop</span> <span class="ruby-keyword">do</span>
530
+ <span class="ruby-comment"># Set the status to paused.</span>
531
+ <span class="ruby-comment"># May need to do this repeatedly because there could be workers in a chained job still doing work.</span>
532
+ <span class="ruby-identifier">pause!</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">status</span>.<span class="ruby-identifier">paused?</span>
533
+ <span class="ruby-keyword">break</span> <span class="ruby-keyword">unless</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">worker</span>.<span class="ruby-identifier">paused?</span>
534
+ <span class="ruby-identifier">sleep</span> <span class="ruby-value">60</span>
535
+ <span class="ruby-keyword">end</span>
536
+ <span class="ruby-identifier">set_status</span>({<span class="ruby-string">'status'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">'working'</span>}, *<span class="ruby-identifier">messages</span>) <span class="ruby-keyword">unless</span> <span class="ruby-identifier">status</span> <span class="ruby-operator">&amp;&amp;</span> (<span class="ruby-identifier">status</span>.<span class="ruby-identifier">completed?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">status</span>.<span class="ruby-identifier">paused?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">status</span>.<span class="ruby-identifier">killed?</span>)
537
+ <span class="ruby-keyword">end</span>
384
538
  <span class="ruby-keyword">end</span></pre>
385
539
  </div><!-- tick-source -->
386
540