job_boss 0.2 → 0.4

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.
Files changed (56) hide show
  1. data/README.markdown +25 -2
  2. data/Rakefile +21 -8
  3. data/bin/job_boss +1 -0
  4. data/doc/ActiveSupport/TestCase.html +584 -0
  5. data/doc/{Passenger.html → ActiveSupport.html} +10 -30
  6. data/doc/CreateJobs.html +31 -16
  7. data/doc/{Mongrel.html → DaemonTest.html} +23 -39
  8. data/doc/JobBoss/Boss.html +466 -68
  9. data/doc/JobBoss/Config.html +77 -39
  10. data/doc/JobBoss/Job.html +375 -97
  11. data/doc/JobBoss/Queuer.html +35 -21
  12. data/doc/JobBoss.html +14 -311
  13. data/doc/{ActiveRecord.html → MathJobs.html} +66 -36
  14. data/doc/Rakefile.html +43 -9
  15. data/doc/SleepJobs.html +251 -0
  16. data/doc/{PhusionPassenger.html → StringJobs.html} +66 -38
  17. data/doc/bin/job_boss.html +1 -1
  18. data/doc/created.rid +14 -8
  19. data/doc/index.html +63 -7
  20. data/doc/lib/job_boss/boss_rb.html +5 -1
  21. data/doc/lib/job_boss/{configuror_rb.html → config_rb.html} +2 -2
  22. data/doc/lib/job_boss/job_rb.html +3 -1
  23. data/doc/lib/job_boss/queuer_rb.html +1 -1
  24. data/doc/lib/migrate_rb.html +1 -1
  25. data/doc/{vendor/spawn/lib/spawn_rb.html → test/app_root/app/jobs/math_jobs_rb.html} +7 -7
  26. data/doc/{vendor/spawn/lib/patches_rb.html → test/app_root/app/jobs/sleep_jobs_rb.html} +8 -12
  27. data/doc/test/app_root/app/jobs/string_jobs_rb.html +52 -0
  28. data/doc/test/test_helper_rb.html +62 -0
  29. data/doc/{vendor/spawn/init_rb.html → test/unit/daemon_test_rb.html} +3 -3
  30. data/doc/test/unit/job_test_rb.html +60 -0
  31. data/job_boss.gemspec +3 -2
  32. data/lib/job_boss/boss.rb +29 -7
  33. data/lib/job_boss/config.rb +49 -0
  34. data/lib/job_boss/job.rb +57 -13
  35. data/lib/migrate.rb +3 -1
  36. data/test/app_root/app/jobs/math_jobs.rb +5 -0
  37. data/test/app_root/app/jobs/sleep_jobs.rb +9 -0
  38. data/test/app_root/app/jobs/string_jobs.rb +5 -0
  39. data/test/app_root/config/database.yml +22 -0
  40. data/test/test_helper.rb +113 -0
  41. data/test/unit/daemon_test.rb +29 -0
  42. data/test/unit/job_test.rb +73 -0
  43. metadata +46 -27
  44. data/doc/ActiveRecord/Base.html +0 -343
  45. data/doc/Mongrel/HttpServer.html +0 -275
  46. data/doc/Passenger/Railz/RequestHandler.html +0 -271
  47. data/doc/Passenger/Railz.html +0 -185
  48. data/doc/PhusionPassenger/Rack/RequestHandler.html +0 -271
  49. data/doc/PhusionPassenger/Rack.html +0 -185
  50. data/doc/PhusionPassenger/Railz/RequestHandler.html +0 -271
  51. data/doc/PhusionPassenger/Railz.html +0 -185
  52. data/doc/Spawn/SpawnId.html +0 -276
  53. data/doc/Spawn.html +0 -742
  54. data/doc/vendor/spawn/CHANGELOG.html +0 -275
  55. data/doc/vendor/spawn/LICENSE.html +0 -151
  56. data/lib/job_boss/configuror.rb +0 -40
@@ -71,10 +71,28 @@
71
71
 
72
72
  <li><a href="#method-c-config">::config</a></li>
73
73
 
74
+ <li><a href="#method-c-logger">::logger</a></li>
75
+
74
76
  <li><a href="#method-c-new">::new</a></li>
75
77
 
76
78
  <li><a href="#method-c-queue">::queue</a></li>
77
79
 
80
+ <li><a href="#method-c-resolve_path">::resolve_path</a></li>
81
+
82
+ <li><a href="#method-i-available_employees">#available_employees</a></li>
83
+
84
+ <li><a href="#method-i-cleanup_running_jobs">#cleanup_running_jobs</a></li>
85
+
86
+ <li><a href="#method-i-establish_active_record_connection">#establish_active_record_connection</a></li>
87
+
88
+ <li><a href="#method-i-kill_job">#kill_job</a></li>
89
+
90
+ <li><a href="#method-i-migrate">#migrate</a></li>
91
+
92
+ <li><a href="#method-i-require_job_classes">#require_job_classes</a></li>
93
+
94
+ <li><a href="#method-i-shutdown_running_jobs">#shutdown_running_jobs</a></li>
95
+
78
96
  <li><a href="#method-i-start">#start</a></li>
79
97
 
80
98
  <li><a href="#method-i-stop">#stop</a></li>
@@ -125,8 +143,20 @@
125
143
 
126
144
  <li><a href="../JobBoss/Queuer.html">JobBoss::Queuer</a></li>
127
145
 
146
+ <li><a href="../ActiveSupport.html">ActiveSupport</a></li>
147
+
148
+ <li><a href="../ActiveSupport/TestCase.html">ActiveSupport::TestCase</a></li>
149
+
128
150
  <li><a href="../CreateJobs.html">CreateJobs</a></li>
129
151
 
152
+ <li><a href="../DaemonTest.html">DaemonTest</a></li>
153
+
154
+ <li><a href="../MathJobs.html">MathJobs</a></li>
155
+
156
+ <li><a href="../SleepJobs.html">SleepJobs</a></li>
157
+
158
+ <li><a href="../StringJobs.html">StringJobs</a></li>
159
+
130
160
  </ul>
131
161
  <div id="no-class-search-results" style="display: none;">No matching classes.</div>
132
162
  </div>
@@ -178,11 +208,48 @@ Used to set <a href="Boss.html">Boss</a> configuration Usage:
178
208
  <div class="method-source-code"
179
209
  id="config-source">
180
210
  <pre>
181
- <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 7</span>
182
- 7: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">config</span>
183
- 8: <span class="ruby-identifier">require</span> <span class="ruby-value str">'job_boss/config'</span>
184
- 9: <span class="ruby-identifier">@@config</span> <span class="ruby-operator">||=</span> <span class="ruby-constant">Config</span>.<span class="ruby-identifier">new</span>
185
- 10: <span class="ruby-keyword kw">end</span></pre>
211
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 10</span>
212
+ 10: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">config</span>
213
+ 11: <span class="ruby-identifier">require</span> <span class="ruby-value str">'job_boss/config'</span>
214
+ 12: <span class="ruby-identifier">@@config</span> <span class="ruby-operator">||=</span> <span class="ruby-constant">Config</span>.<span class="ruby-identifier">new</span>
215
+ 13: <span class="ruby-keyword kw">end</span></pre>
216
+ </div>
217
+
218
+ </div>
219
+
220
+
221
+
222
+
223
+ </div>
224
+
225
+
226
+ <div id="logger-method" class="method-detail ">
227
+ <a name="method-c-logger"></a>
228
+
229
+ <div class="method-heading">
230
+
231
+ <span class="method-name">logger</span><span
232
+ class="method-args">()</span>
233
+ <span class="method-click-advice">click to toggle source</span>
234
+
235
+ </div>
236
+
237
+ <div class="method-description">
238
+
239
+
240
+
241
+
242
+
243
+ <div class="method-source-code"
244
+ id="logger-source">
245
+ <pre>
246
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 23</span>
247
+ 23: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">logger</span>
248
+ 24: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">log_path</span> = <span class="ruby-identifier">resolve_path</span>(<span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">log_path</span>)
249
+ 25:
250
+ 26: <span class="ruby-identifier">require</span> <span class="ruby-value str">'logger'</span>
251
+ 27: <span class="ruby-constant">Logger</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">log_path</span>)
252
+ 28: <span class="ruby-keyword kw">end</span></pre>
186
253
  </div>
187
254
 
188
255
  </div>
@@ -213,16 +280,16 @@ Used to set <a href="Boss.html">Boss</a> configuration Usage:
213
280
  <div class="method-source-code"
214
281
  id="new-source">
215
282
  <pre>
216
- <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 21</span>
217
- 21: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">options</span> = {})
218
- 22: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">working_dir</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">options</span>[<span class="ruby-value">:working_dir</span>]
219
- 23: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">sleep_interval</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">options</span>[<span class="ruby-value">:sleep_interval</span>]
220
- 24: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">employee_limit</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">options</span>[<span class="ruby-value">:employee_limit</span>]
221
- 25: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">database_yaml_path</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">options</span>[<span class="ruby-value">:database_yaml_path</span>]
222
- 26: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">jobs_path</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">options</span>[<span class="ruby-value">:jobs_path</span>]
223
- 27:
224
- 28: <span class="ruby-ivar">@running_jobs</span> = []
225
- 29: <span class="ruby-keyword kw">end</span></pre>
283
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 41</span>
284
+ 41: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">options</span> = {})
285
+ 42: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">application_root</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">options</span>[<span class="ruby-value">:working_dir</span>]
286
+ 43: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">sleep_interval</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">options</span>[<span class="ruby-value">:sleep_interval</span>]
287
+ 44: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">employee_limit</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">options</span>[<span class="ruby-value">:employee_limit</span>]
288
+ 45: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">database_yaml_path</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">options</span>[<span class="ruby-value">:database_yaml_path</span>]
289
+ 46: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">jobs_path</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">options</span>[<span class="ruby-value">:jobs_path</span>]
290
+ 47:
291
+ 48: <span class="ruby-ivar">@running_jobs</span> = []
292
+ 49: <span class="ruby-keyword kw">end</span></pre>
226
293
  </div>
227
294
 
228
295
  </div>
@@ -257,11 +324,52 @@ Used to queue jobs Usage:
257
324
  <div class="method-source-code"
258
325
  id="queue-source">
259
326
  <pre>
260
- <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 15</span>
261
- 15: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">queue</span>
262
- 16: <span class="ruby-identifier">require</span> <span class="ruby-value str">'job_boss/queuer'</span>
263
- 17: <span class="ruby-identifier">@@queuer</span> <span class="ruby-operator">||=</span> <span class="ruby-constant">Queuer</span>.<span class="ruby-identifier">new</span>
264
- 18: <span class="ruby-keyword kw">end</span></pre>
327
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 18</span>
328
+ 18: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">queue</span>
329
+ 19: <span class="ruby-identifier">require</span> <span class="ruby-value str">'job_boss/queuer'</span>
330
+ 20: <span class="ruby-identifier">@@queuer</span> <span class="ruby-operator">||=</span> <span class="ruby-constant">Queuer</span>.<span class="ruby-identifier">new</span>
331
+ 21: <span class="ruby-keyword kw">end</span></pre>
332
+ </div>
333
+
334
+ </div>
335
+
336
+
337
+
338
+
339
+ </div>
340
+
341
+
342
+ <div id="resolve-path-method" class="method-detail ">
343
+ <a name="method-c-resolve_path"></a>
344
+
345
+ <div class="method-heading">
346
+
347
+ <span class="method-name">resolve_path</span><span
348
+ class="method-args">(path)</span>
349
+ <span class="method-click-advice">click to toggle source</span>
350
+
351
+ </div>
352
+
353
+ <div class="method-description">
354
+
355
+ <p>
356
+ If path starts with &#8217;/&#8217;, leave alone. Otherwise, prepend
357
+ application_root
358
+ </p>
359
+
360
+
361
+
362
+ <div class="method-source-code"
363
+ id="resolve-path-source">
364
+ <pre>
365
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 32</span>
366
+ 32: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">resolve_path</span>(<span class="ruby-identifier">path</span>)
367
+ 33: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">path</span> <span class="ruby-operator">==</span> <span class="ruby-value">//</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">path</span>.<span class="ruby-identifier">match</span>(<span class="ruby-node">/^#{@@config.application_root}/</span>)
368
+ 34: <span class="ruby-identifier">path</span>
369
+ 35: <span class="ruby-keyword kw">else</span>
370
+ 36: <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">application_root</span>, <span class="ruby-identifier">path</span>)
371
+ 37: <span class="ruby-keyword kw">end</span>
372
+ 38: <span class="ruby-keyword kw">end</span></pre>
265
373
  </div>
266
374
 
267
375
  </div>
@@ -300,48 +408,50 @@ Start the boss
300
408
  <div class="method-source-code"
301
409
  id="start-source">
302
410
  <pre>
303
- <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 32</span>
304
- 32: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">start</span>
305
- 33: <span class="ruby-identifier">require</span> <span class="ruby-value str">'active_record'</span>
306
- 34: <span class="ruby-identifier">require</span> <span class="ruby-value str">'yaml'</span>
307
- 35:
308
- 36: <span class="ruby-identifier">connect</span>
309
- 37:
310
- 38: <span class="ruby-identifier">require_job_classes</span>
311
- 39:
312
- 40: <span class="ruby-identifier">require</span> <span class="ruby-value str">'job_boss/job'</span>
313
- 41:
314
- 42: <span class="ruby-identifier">migrate</span>
315
- 43:
316
- 44: <span class="ruby-constant">Signal</span>.<span class="ruby-identifier">trap</span>(<span class="ruby-value str">&quot;HUP&quot;</span>) <span class="ruby-keyword kw">do</span>
317
- 45: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">stop</span>
318
- 46: <span class="ruby-keyword kw">end</span>
319
- 47:
320
- 48: <span class="ruby-identifier">at_exit</span> <span class="ruby-keyword kw">do</span>
321
- 49: <span class="ruby-identifier">stop</span> <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Process</span>.<span class="ruby-identifier">pid</span> <span class="ruby-operator">==</span> <span class="ruby-constant">BOSS_PID</span>
322
- 50: <span class="ruby-keyword kw">end</span>
323
- 51:
324
- 52: <span class="ruby-identifier">puts</span> <span class="ruby-value str">&quot;Job Boss started&quot;</span>
325
- 53:
326
- 54: <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
327
- 55: <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">children_count</span> = <span class="ruby-identifier">available_employees</span>) <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-constant">Job</span>.<span class="ruby-identifier">pending</span>.<span class="ruby-identifier">count</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
328
- 56: <span class="ruby-identifier">sleep</span>(<span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">sleep_interval</span>)
329
- 57: <span class="ruby-keyword kw">next</span>
330
- 58: <span class="ruby-keyword kw">end</span>
411
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 52</span>
412
+ 52: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">start</span>
413
+ 53: <span class="ruby-identifier">require</span> <span class="ruby-value str">'active_record'</span>
414
+ 54: <span class="ruby-identifier">require</span> <span class="ruby-value str">'yaml'</span>
415
+ 55:
416
+ 56: <span class="ruby-identifier">establish_active_record_connection</span>
417
+ 57:
418
+ 58: <span class="ruby-identifier">require_job_classes</span>
331
419
  59:
332
- 60: <span class="ruby-constant">Job</span>.<span class="ruby-identifier">pending_paths</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">path</span><span class="ruby-operator">|</span>
333
- 61: <span class="ruby-identifier">job</span> = <span class="ruby-constant">Job</span>.<span class="ruby-identifier">pending</span>.<span class="ruby-identifier">find_by_path</span>(<span class="ruby-identifier">path</span>)
334
- 62: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">job</span>.<span class="ruby-identifier">nil?</span>
420
+ 60: <span class="ruby-identifier">require</span> <span class="ruby-value str">'job_boss/job'</span>
421
+ 61:
422
+ 62: <span class="ruby-identifier">migrate</span>
335
423
  63:
336
- 64: <span class="ruby-identifier">job</span>.<span class="ruby-identifier">dispatch</span>
337
- 65: <span class="ruby-ivar">@running_jobs</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">job</span>
338
- 66:
339
- 67: <span class="ruby-identifier">children_count</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
340
- 68: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">children_count</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
341
- 69: <span class="ruby-keyword kw">end</span>
342
- 70:
343
- 71: <span class="ruby-keyword kw">end</span>
344
- 72: <span class="ruby-keyword kw">end</span></pre>
424
+ 64: <span class="ruby-constant">Signal</span>.<span class="ruby-identifier">trap</span>(<span class="ruby-value str">&quot;HUP&quot;</span>) <span class="ruby-keyword kw">do</span>
425
+ 65: <span class="ruby-identifier">stop</span>
426
+ 66: <span class="ruby-keyword kw">end</span>
427
+ 67:
428
+ 68: <span class="ruby-identifier">at_exit</span> <span class="ruby-keyword kw">do</span>
429
+ 69: <span class="ruby-identifier">stop</span> <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Process</span>.<span class="ruby-identifier">pid</span> <span class="ruby-operator">==</span> <span class="ruby-constant">BOSS_PID</span>
430
+ 70: <span class="ruby-keyword kw">end</span>
431
+ 71:
432
+ 72: <span class="ruby-constant">Boss</span>.<span class="ruby-identifier">logger</span>.<span class="ruby-identifier">info</span> <span class="ruby-value str">&quot;Job Boss started&quot;</span>
433
+ 73:
434
+ 74: <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
435
+ 75: <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">children_count</span> = <span class="ruby-identifier">available_employees</span>) <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-constant">Job</span>.<span class="ruby-identifier">pending</span>.<span class="ruby-identifier">count</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
436
+ 76: <span class="ruby-identifier">sleep</span>(<span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">sleep_interval</span>)
437
+ 77: <span class="ruby-keyword kw">next</span>
438
+ 78: <span class="ruby-keyword kw">end</span>
439
+ 79:
440
+ 80: <span class="ruby-comment cmt"># Go through each pending path so that we don't get stuck just processing</span>
441
+ 81: <span class="ruby-comment cmt"># long running jobs which would leave quicker jobs to suffocate</span>
442
+ 82: <span class="ruby-constant">Job</span>.<span class="ruby-identifier">pending_paths</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">path</span><span class="ruby-operator">|</span>
443
+ 83: <span class="ruby-identifier">job</span> = <span class="ruby-constant">Job</span>.<span class="ruby-identifier">pending</span>.<span class="ruby-identifier">find_by_path</span>(<span class="ruby-identifier">path</span>)
444
+ 84: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">job</span>.<span class="ruby-identifier">nil?</span>
445
+ 85:
446
+ 86: <span class="ruby-identifier">job</span>.<span class="ruby-identifier">dispatch</span>
447
+ 87: <span class="ruby-ivar">@running_jobs</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">job</span>
448
+ 88:
449
+ 89: <span class="ruby-identifier">children_count</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
450
+ 90: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">children_count</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
451
+ 91: <span class="ruby-keyword kw">end</span>
452
+ 92:
453
+ 93: <span class="ruby-keyword kw">end</span>
454
+ 94: <span class="ruby-keyword kw">end</span></pre>
345
455
  </div>
346
456
 
347
457
  </div>
@@ -372,14 +482,302 @@ Start the boss
372
482
  <div class="method-source-code"
373
483
  id="stop-source">
374
484
  <pre>
375
- <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 74</span>
376
- 74: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">stop</span>
377
- 75: <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Stopping #{@running_jobs.size} running employees...&quot;</span>
378
- 76:
379
- 77: <span class="ruby-identifier">shutdown_running_jobs</span>
380
- 78:
381
- 79: <span class="ruby-identifier">puts</span> <span class="ruby-value str">&quot;Job Boss stopped&quot;</span>
382
- 80: <span class="ruby-keyword kw">end</span></pre>
485
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 96</span>
486
+ 96: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">stop</span>
487
+ 97: <span class="ruby-constant">Boss</span>.<span class="ruby-identifier">logger</span>.<span class="ruby-identifier">info</span> <span class="ruby-node">&quot;Stopping #{@running_jobs.size} running employees...&quot;</span>
488
+ 98:
489
+ 99: <span class="ruby-identifier">shutdown_running_jobs</span>
490
+ 100:
491
+ 101: <span class="ruby-constant">Boss</span>.<span class="ruby-identifier">logger</span>.<span class="ruby-identifier">info</span> <span class="ruby-value str">&quot;Job Boss stopped&quot;</span>
492
+ 102: <span class="ruby-keyword kw">end</span></pre>
493
+ </div>
494
+
495
+ </div>
496
+
497
+
498
+
499
+
500
+ </div>
501
+
502
+
503
+ </div>
504
+
505
+ <div id="private-instance-method-details" class="method-section section">
506
+ <h3 class="section-header">Private Instance Methods</h3>
507
+
508
+
509
+ <div id="available-employees-method" class="method-detail ">
510
+ <a name="method-i-available_employees"></a>
511
+
512
+ <div class="method-heading">
513
+
514
+ <span class="method-name">available_employees</span><span
515
+ class="method-args">()</span>
516
+ <span class="method-click-advice">click to toggle source</span>
517
+
518
+ </div>
519
+
520
+ <div class="method-description">
521
+
522
+ <p>
523
+ Total number of employees which can be run
524
+ </p>
525
+
526
+
527
+
528
+ <div class="method-source-code"
529
+ id="available-employees-source">
530
+ <pre>
531
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 127</span>
532
+ 127: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">available_employees</span>
533
+ 128: <span class="ruby-identifier">cleanup_running_jobs</span>
534
+ 129:
535
+ 130: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">employee_limit</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@running_jobs</span>.<span class="ruby-identifier">size</span>
536
+ 131: <span class="ruby-keyword kw">end</span></pre>
537
+ </div>
538
+
539
+ </div>
540
+
541
+
542
+
543
+
544
+ </div>
545
+
546
+
547
+ <div id="cleanup-running-jobs-method" class="method-detail ">
548
+ <a name="method-i-cleanup_running_jobs"></a>
549
+
550
+ <div class="method-heading">
551
+
552
+ <span class="method-name">cleanup_running_jobs</span><span
553
+ class="method-args">()</span>
554
+ <span class="method-click-advice">click to toggle source</span>
555
+
556
+ </div>
557
+
558
+ <div class="method-description">
559
+
560
+ <p>
561
+ Cleans up @running_jobs variable, getting rid of jobs which have completed,
562
+ which have been cancelled, or which went MIA
563
+ </p>
564
+
565
+
566
+
567
+ <div class="method-source-code"
568
+ id="cleanup-running-jobs-source">
569
+ <pre>
570
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 107</span>
571
+ 107: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">cleanup_running_jobs</span>
572
+ 108: <span class="ruby-constant">Job</span>.<span class="ruby-identifier">uncached</span> <span class="ruby-keyword kw">do</span>
573
+ 109: <span class="ruby-ivar">@running_jobs</span> = <span class="ruby-constant">Job</span>.<span class="ruby-identifier">running</span>.<span class="ruby-identifier">where</span>(<span class="ruby-value str">'id in (?)'</span>, <span class="ruby-ivar">@running_jobs</span>)
574
+ 110:
575
+ 111: <span class="ruby-identifier">cancelled_jobs</span> = <span class="ruby-ivar">@running_jobs</span>.<span class="ruby-identifier">select</span>(&amp;<span class="ruby-value">:cancelled?</span>)
576
+ 112: <span class="ruby-identifier">cancelled_jobs</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">job</span><span class="ruby-operator">|</span> <span class="ruby-identifier">kill_job</span>(<span class="ruby-identifier">job</span>) }
577
+ 113: <span class="ruby-ivar">@running_jobs</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">cancelled_jobs</span>
578
+ 114:
579
+ 115: <span class="ruby-comment cmt"># Clean out any jobs whos processes have stopped running for some reason</span>
580
+ 116: <span class="ruby-ivar">@running_jobs</span> = <span class="ruby-ivar">@running_jobs</span>.<span class="ruby-identifier">select</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">job</span><span class="ruby-operator">|</span>
581
+ 117: <span class="ruby-keyword kw">begin</span>
582
+ 118: <span class="ruby-constant">Process</span>.<span class="ruby-identifier">kill</span>(<span class="ruby-value">0</span>, <span class="ruby-identifier">job</span>.<span class="ruby-identifier">employee_pid</span>.<span class="ruby-identifier">to_i</span>)
583
+ 119: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ESRCH</span>
584
+ 120: <span class="ruby-keyword kw">nil</span>
585
+ 121: <span class="ruby-keyword kw">end</span>
586
+ 122: <span class="ruby-keyword kw">end</span>
587
+ 123: <span class="ruby-keyword kw">end</span>
588
+ 124: <span class="ruby-keyword kw">end</span></pre>
589
+ </div>
590
+
591
+ </div>
592
+
593
+
594
+
595
+
596
+ </div>
597
+
598
+
599
+ <div id="establish-active-record-connection-method" class="method-detail ">
600
+ <a name="method-i-establish_active_record_connection"></a>
601
+
602
+ <div class="method-heading">
603
+
604
+ <span class="method-name">establish_active_record_connection</span><span
605
+ class="method-args">()</span>
606
+ <span class="method-click-advice">click to toggle source</span>
607
+
608
+ </div>
609
+
610
+ <div class="method-description">
611
+
612
+
613
+
614
+
615
+
616
+ <div class="method-source-code"
617
+ id="establish-active-record-connection-source">
618
+ <pre>
619
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 133</span>
620
+ 133: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">establish_active_record_connection</span>
621
+ 134: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">database_yaml_path</span> = <span class="ruby-constant">Boss</span>.<span class="ruby-identifier">resolve_path</span>(<span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">database_yaml_path</span>)
622
+ 135:
623
+ 136: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Database YAML file missing (#{@@config.database_yaml_path})&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">database_yaml_path</span>)
624
+ 137:
625
+ 138: <span class="ruby-identifier">config</span> = <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load</span>(<span class="ruby-constant">File</span>.<span class="ruby-identifier">read</span>(<span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">database_yaml_path</span>))
626
+ 139:
627
+ 140: <span class="ruby-constant">ActiveRecord</span><span class="ruby-operator">::</span><span class="ruby-constant">Base</span>.<span class="ruby-identifier">establish_connection</span>(<span class="ruby-identifier">config</span>[<span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">environment</span>])
628
+ 141: <span class="ruby-keyword kw">end</span></pre>
629
+ </div>
630
+
631
+ </div>
632
+
633
+
634
+
635
+
636
+ </div>
637
+
638
+
639
+ <div id="kill-job-method" class="method-detail ">
640
+ <a name="method-i-kill_job"></a>
641
+
642
+ <div class="method-heading">
643
+
644
+ <span class="method-name">kill_job</span><span
645
+ class="method-args">(job)</span>
646
+ <span class="method-click-advice">click to toggle source</span>
647
+
648
+ </div>
649
+
650
+ <div class="method-description">
651
+
652
+
653
+
654
+
655
+
656
+ <div class="method-source-code"
657
+ id="kill-job-source">
658
+ <pre>
659
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 158</span>
660
+ 158: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">kill_job</span>(<span class="ruby-identifier">job</span>)
661
+ 159: <span class="ruby-keyword kw">begin</span>
662
+ 160: <span class="ruby-constant">Process</span>.<span class="ruby-identifier">kill</span>(<span class="ruby-value str">&quot;HUP&quot;</span>, <span class="ruby-identifier">job</span>.<span class="ruby-identifier">employee_pid</span>.<span class="ruby-identifier">to_i</span>)
663
+ 161: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ESRCH</span>
664
+ 162: <span class="ruby-keyword kw">nil</span>
665
+ 163: <span class="ruby-keyword kw">end</span>
666
+ 164: <span class="ruby-keyword kw">end</span></pre>
667
+ </div>
668
+
669
+ </div>
670
+
671
+
672
+
673
+
674
+ </div>
675
+
676
+
677
+ <div id="migrate-method" class="method-detail ">
678
+ <a name="method-i-migrate"></a>
679
+
680
+ <div class="method-heading">
681
+
682
+ <span class="method-name">migrate</span><span
683
+ class="method-args">()</span>
684
+ <span class="method-click-advice">click to toggle source</span>
685
+
686
+ </div>
687
+
688
+ <div class="method-description">
689
+
690
+
691
+
692
+
693
+
694
+ <div class="method-source-code"
695
+ id="migrate-source">
696
+ <pre>
697
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 151</span>
698
+ 151: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">migrate</span>
699
+ 152: <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">Job</span>.<span class="ruby-identifier">table_exists?</span>
700
+ 153: <span class="ruby-identifier">require</span> <span class="ruby-value str">'migrate'</span>
701
+ 154: <span class="ruby-constant">CreateJobs</span>.<span class="ruby-identifier">up</span>
702
+ 155: <span class="ruby-keyword kw">end</span>
703
+ 156: <span class="ruby-keyword kw">end</span></pre>
704
+ </div>
705
+
706
+ </div>
707
+
708
+
709
+
710
+
711
+ </div>
712
+
713
+
714
+ <div id="require-job-classes-method" class="method-detail ">
715
+ <a name="method-i-require_job_classes"></a>
716
+
717
+ <div class="method-heading">
718
+
719
+ <span class="method-name">require_job_classes</span><span
720
+ class="method-args">()</span>
721
+ <span class="method-click-advice">click to toggle source</span>
722
+
723
+ </div>
724
+
725
+ <div class="method-description">
726
+
727
+
728
+
729
+
730
+
731
+ <div class="method-source-code"
732
+ id="require-job-classes-source">
733
+ <pre>
734
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 143</span>
735
+ 143: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">require_job_classes</span>
736
+ 144: <span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">jobs_path</span> = <span class="ruby-constant">Boss</span>.<span class="ruby-identifier">resolve_path</span>(<span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">jobs_path</span>)
737
+ 145:
738
+ 146: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Jobs path missing (#{@@config.jobs_path})&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">jobs_path</span>)
739
+ 147:
740
+ 148: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">glob</span>(<span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-identifier">@@config</span>.<span class="ruby-identifier">jobs_path</span>, <span class="ruby-value str">'*.rb'</span>)).<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">job_class</span><span class="ruby-operator">|</span> <span class="ruby-identifier">require</span> <span class="ruby-identifier">job_class</span> }
741
+ 149: <span class="ruby-keyword kw">end</span></pre>
742
+ </div>
743
+
744
+ </div>
745
+
746
+
747
+
748
+
749
+ </div>
750
+
751
+
752
+ <div id="shutdown-running-jobs-method" class="method-detail ">
753
+ <a name="method-i-shutdown_running_jobs"></a>
754
+
755
+ <div class="method-heading">
756
+
757
+ <span class="method-name">shutdown_running_jobs</span><span
758
+ class="method-args">()</span>
759
+ <span class="method-click-advice">click to toggle source</span>
760
+
761
+ </div>
762
+
763
+ <div class="method-description">
764
+
765
+
766
+
767
+
768
+
769
+ <div class="method-source-code"
770
+ id="shutdown-running-jobs-source">
771
+ <pre>
772
+ <span class="ruby-comment cmt"># File lib/job_boss/boss.rb, line 166</span>
773
+ 166: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">shutdown_running_jobs</span>
774
+ 167: <span class="ruby-identifier">cleanup_running_jobs</span>
775
+ 168:
776
+ 169: <span class="ruby-ivar">@running_jobs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">job</span><span class="ruby-operator">|</span>
777
+ 170: <span class="ruby-identifier">kill_job</span>(<span class="ruby-identifier">job</span>)
778
+ 171: <span class="ruby-identifier">job</span>.<span class="ruby-identifier">mark_for_redo</span>
779
+ 172: <span class="ruby-keyword kw">end</span>
780
+ 173: <span class="ruby-keyword kw">end</span></pre>
383
781
  </div>
384
782
 
385
783
  </div>