rocketjob 5.1.1 → 5.2.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/bin/rocketjob +2 -2
  3. data/bin/rocketjob_batch_perf +1 -1
  4. data/bin/rocketjob_perf +1 -1
  5. data/lib/rocket_job/active_worker.rb +1 -0
  6. data/lib/rocket_job/batch.rb +16 -17
  7. data/lib/rocket_job/batch/callbacks.rb +1 -2
  8. data/lib/rocket_job/batch/io.rb +10 -6
  9. data/lib/rocket_job/batch/logger.rb +2 -2
  10. data/lib/rocket_job/batch/lower_priority.rb +2 -2
  11. data/lib/rocket_job/batch/model.rb +23 -23
  12. data/lib/rocket_job/batch/performance.rb +19 -21
  13. data/lib/rocket_job/batch/result.rb +1 -1
  14. data/lib/rocket_job/batch/results.rb +1 -1
  15. data/lib/rocket_job/batch/state_machine.rb +5 -6
  16. data/lib/rocket_job/batch/statistics.rb +10 -8
  17. data/lib/rocket_job/batch/tabular.rb +2 -2
  18. data/lib/rocket_job/batch/tabular/input.rb +11 -7
  19. data/lib/rocket_job/batch/tabular/output.rb +1 -1
  20. data/lib/rocket_job/batch/throttle.rb +11 -30
  21. data/lib/rocket_job/batch/{throttle_running_slices.rb → throttle_running_workers.rb} +13 -10
  22. data/lib/rocket_job/batch/worker.rb +102 -85
  23. data/lib/rocket_job/cli.rb +57 -54
  24. data/lib/rocket_job/config.rb +8 -10
  25. data/lib/rocket_job/dirmon_entry.rb +13 -10
  26. data/lib/rocket_job/event.rb +16 -16
  27. data/lib/rocket_job/extensions/mongo/logging.rb +2 -2
  28. data/lib/rocket_job/extensions/mongoid/clients/options.rb +2 -2
  29. data/lib/rocket_job/extensions/mongoid/contextual/mongo.rb +4 -2
  30. data/lib/rocket_job/extensions/mongoid/factory.rb +13 -5
  31. data/lib/rocket_job/extensions/rocket_job_adapter.rb +2 -1
  32. data/lib/rocket_job/job_exception.rb +0 -3
  33. data/lib/rocket_job/jobs/dirmon_job.rb +4 -4
  34. data/lib/rocket_job/jobs/housekeeping_job.rb +7 -7
  35. data/lib/rocket_job/jobs/on_demand_batch_job.rb +14 -4
  36. data/lib/rocket_job/jobs/on_demand_job.rb +3 -3
  37. data/lib/rocket_job/jobs/performance_job.rb +1 -1
  38. data/lib/rocket_job/jobs/re_encrypt/relational_job.rb +11 -10
  39. data/lib/rocket_job/jobs/upload_file_job.rb +9 -5
  40. data/lib/rocket_job/performance.rb +24 -22
  41. data/lib/rocket_job/plugins/cron.rb +7 -3
  42. data/lib/rocket_job/plugins/document.rb +7 -5
  43. data/lib/rocket_job/plugins/job/callbacks.rb +1 -1
  44. data/lib/rocket_job/plugins/job/logger.rb +3 -3
  45. data/lib/rocket_job/plugins/job/model.rb +34 -27
  46. data/lib/rocket_job/plugins/job/persistence.rb +7 -34
  47. data/lib/rocket_job/plugins/job/state_machine.rb +5 -4
  48. data/lib/rocket_job/plugins/job/throttle.rb +12 -28
  49. data/lib/rocket_job/plugins/job/throttle_running_jobs.rb +2 -2
  50. data/lib/rocket_job/plugins/job/worker.rb +22 -70
  51. data/lib/rocket_job/plugins/processing_window.rb +5 -4
  52. data/lib/rocket_job/plugins/restart.rb +3 -3
  53. data/lib/rocket_job/plugins/retry.rb +2 -2
  54. data/lib/rocket_job/plugins/singleton.rb +1 -2
  55. data/lib/rocket_job/plugins/state_machine.rb +4 -4
  56. data/lib/rocket_job/plugins/transaction.rb +1 -1
  57. data/lib/rocket_job/rocket_job.rb +5 -4
  58. data/lib/rocket_job/server.rb +2 -2
  59. data/lib/rocket_job/server/model.rb +14 -13
  60. data/lib/rocket_job/server/state_machine.rb +1 -2
  61. data/lib/rocket_job/sliced/compressed_slice.rb +4 -4
  62. data/lib/rocket_job/sliced/encrypted_slice.rb +4 -4
  63. data/lib/rocket_job/sliced/input.rb +16 -16
  64. data/lib/rocket_job/sliced/output.rb +2 -2
  65. data/lib/rocket_job/sliced/slice.rb +43 -20
  66. data/lib/rocket_job/sliced/slices.rb +14 -11
  67. data/lib/rocket_job/subscriber.rb +6 -6
  68. data/lib/rocket_job/subscribers/logger.rb +3 -3
  69. data/lib/rocket_job/supervisor.rb +12 -12
  70. data/lib/rocket_job/supervisor/shutdown.rb +7 -7
  71. data/lib/rocket_job/throttle_definition.rb +37 -0
  72. data/lib/rocket_job/throttle_definitions.rb +39 -0
  73. data/lib/rocket_job/version.rb +1 -1
  74. data/lib/rocket_job/worker.rb +116 -34
  75. data/lib/rocket_job/worker_pool.rb +6 -6
  76. data/lib/rocketjob.rb +72 -76
  77. metadata +16 -18
  78. data/lib/rocket_job/extensions/mongoid_5/clients/options.rb +0 -38
  79. data/lib/rocket_job/extensions/mongoid_5/contextual/mongo.rb +0 -64
  80. data/lib/rocket_job/extensions/mongoid_5/factory.rb +0 -13
@@ -1,4 +1,4 @@
1
- require 'active_support/concern'
1
+ require "active_support/concern"
2
2
 
3
3
  module RocketJob
4
4
  module Plugins
@@ -8,27 +8,29 @@ module RocketJob
8
8
  include ::Mongoid::Document
9
9
 
10
10
  included do
11
- store_in client: 'rocketjob'
11
+ store_in client: "rocketjob"
12
12
  end
13
13
 
14
+ # rubocop:disable Style/RedundantSort
14
15
  module ClassMethods
15
16
  # Mongoid does not apply ordering, add sort
16
17
  def first
17
- all.sort('_id' => 1).first
18
+ all.sort("_id" => 1).first
18
19
  end
19
20
 
20
21
  # Mongoid does not apply ordering, add sort
21
22
  def last
22
- all.sort('_id' => -1).first
23
+ all.sort("_id" => -1).first
23
24
  end
24
25
  end
26
+ # rubocop:enable Style/RedundantSort
25
27
 
26
28
  private
27
29
 
28
30
  # Apply changes to this document returning the updated document from the database.
29
31
  # Allows other changes to be made on the server that will be loaded.
30
32
  def find_and_update(attrs)
31
- doc = collection.find(_id: id).find_one_and_update({'$set' => attrs}, return_document: :after)
33
+ doc = collection.find(_id: id).find_one_and_update({"$set" => attrs}, return_document: :after)
32
34
  raise(::Mongoid::Errors::DocumentNotFound.new(self.class, id)) unless doc
33
35
 
34
36
  # Clear out keys that are not returned during the reload from MongoDB
@@ -1,4 +1,4 @@
1
- require 'active_support/concern'
1
+ require "active_support/concern"
2
2
 
3
3
  module RocketJob
4
4
  module Plugins
@@ -1,4 +1,4 @@
1
- require 'active_support/concern'
1
+ require "active_support/concern"
2
2
 
3
3
  module RocketJob
4
4
  module Plugins
@@ -18,9 +18,9 @@ module RocketJob
18
18
  # - on_exception_level changes log level from info to error on exception
19
19
  # - silence noisy jobs by raising log level
20
20
  def rocket_job_around_logger(&block)
21
- logger.info('Start #perform')
21
+ logger.info("Start #perform")
22
22
  logger.measure_info(
23
- 'Completed #perform',
23
+ "Completed #perform",
24
24
  metric: "#{self.class.name}/perform",
25
25
  log_exception: :full,
26
26
  on_exception_level: :error,
@@ -1,4 +1,4 @@
1
- require 'active_support/concern'
1
+ require "active_support/concern"
2
2
 
3
3
  module RocketJob
4
4
  module Plugins
@@ -87,7 +87,7 @@ module RocketJob
87
87
  field :percent_complete, type: Integer, default: 0
88
88
 
89
89
  # Store the last exception for this job
90
- embeds_one :exception, class_name: 'RocketJob::JobException'
90
+ embeds_one :exception, class_name: "RocketJob::JobException"
91
91
 
92
92
  # Store the Hash result from this job if collect_output is true,
93
93
  # and the job returned actually returned a Hash, otherwise nil
@@ -110,7 +110,7 @@ module RocketJob
110
110
  # job.underscore_name
111
111
  # # => "data_study"
112
112
  def underscore_name
113
- @underscore_name ||= name.sub(/Job$/, '').underscore
113
+ @underscore_name ||= name.sub(/Job$/, "").underscore
114
114
  end
115
115
 
116
116
  # Allow the collective name for this job class to be overridden
@@ -125,7 +125,7 @@ module RocketJob
125
125
  # job.human_name
126
126
  # # => "Data Study"
127
127
  def human_name
128
- @human_name ||= name.sub(/Job$/, '').titleize
128
+ @human_name ||= name.sub(/Job$/, "").titleize
129
129
  end
130
130
 
131
131
  # Allow the human readable job name for this job class to be overridden
@@ -140,7 +140,7 @@ module RocketJob
140
140
  # job.collective_name
141
141
  # # => "data_studies"
142
142
  def collective_name
143
- @collective_name ||= name.sub(/Job$/, '').pluralize.underscore
143
+ @collective_name ||= name.sub(/Job$/, "").pluralize.underscore
144
144
  end
145
145
 
146
146
  # Allow the collective name for this job class to be overridden
@@ -155,8 +155,14 @@ module RocketJob
155
155
 
156
156
  # Scope for queued jobs that can run now
157
157
  # I.e. Queued jobs excluding scheduled jobs
158
- def queued_now
159
- queued.or({run_at: nil}, :run_at.lte => Time.now)
158
+ if Mongoid::VERSION.to_f >= 7.1
159
+ def queued_now
160
+ queued.and(RocketJob::Job.where(run_at: nil).or(:run_at.lte => Time.now))
161
+ end
162
+ else
163
+ def queued_now
164
+ queued.or({run_at: nil}, :run_at.lte => Time.now)
165
+ end
160
166
  end
161
167
 
162
168
  # Defines all the fields that are accessible on the Document
@@ -193,7 +199,7 @@ module RocketJob
193
199
 
194
200
  # DEPRECATED
195
201
  def rocket_job
196
- warn 'Replace calls to .rocket_job with calls to set class instance variables. For example: self.priority = 50'
202
+ warn "Replace calls to .rocket_job with calls to set class instance variables. For example: self.priority = 50"
197
203
  yield(self)
198
204
  end
199
205
 
@@ -276,42 +282,42 @@ module RocketJob
276
282
  # Returns [Hash] status of this job
277
283
  def as_json
278
284
  attrs = serializable_hash(methods: %i[seconds duration])
279
- attrs.delete('result') unless collect_output?
280
- attrs.delete('failure_count') unless failure_count.positive?
285
+ attrs.delete("result") unless collect_output?
286
+ attrs.delete("failure_count") unless failure_count.positive?
281
287
  if queued?
282
- attrs.delete('started_at')
283
- attrs.delete('completed_at')
284
- attrs.delete('result')
288
+ attrs.delete("started_at")
289
+ attrs.delete("completed_at")
290
+ attrs.delete("result")
285
291
  attrs
286
292
  elsif running?
287
- attrs.delete('completed_at')
288
- attrs.delete('result')
293
+ attrs.delete("completed_at")
294
+ attrs.delete("result")
289
295
  attrs
290
296
  elsif completed?
291
- attrs.delete('percent_complete')
297
+ attrs.delete("percent_complete")
292
298
  attrs
293
299
  elsif paused?
294
- attrs.delete('completed_at')
295
- attrs.delete('result')
300
+ attrs.delete("completed_at")
301
+ attrs.delete("result")
296
302
  # Ensure 'paused_at' appears first in the hash
297
- {'paused_at' => completed_at}.merge(attrs)
303
+ {"paused_at" => completed_at}.merge(attrs)
298
304
  elsif aborted?
299
- attrs.delete('completed_at')
300
- attrs.delete('result')
301
- {'aborted_at' => completed_at}.merge(attrs)
305
+ attrs.delete("completed_at")
306
+ attrs.delete("result")
307
+ {"aborted_at" => completed_at}.merge(attrs)
302
308
  elsif failed?
303
- attrs.delete('completed_at')
304
- attrs.delete('result')
305
- {'failed_at' => completed_at}.merge(attrs)
309
+ attrs.delete("completed_at")
310
+ attrs.delete("result")
311
+ {"failed_at" => completed_at}.merge(attrs)
306
312
  else
307
313
  attrs
308
314
  end
309
315
  end
310
316
 
311
317
  # Returns [Hash] the status of this job
312
- def status(time_zone = 'Eastern Time (US & Canada)')
318
+ def status(time_zone = "Eastern Time (US & Canada)")
313
319
  h = as_json
314
- h.delete('seconds')
320
+ h.delete("seconds")
315
321
  h.dup.each_pair do |k, v|
316
322
  if v.is_a?(Time)
317
323
  h[k] = v.in_time_zone(time_zone).to_s
@@ -325,6 +331,7 @@ module RocketJob
325
331
  # Returns [Boolean] whether the worker runs on a particular server.
326
332
  def worker_on_server?(server_name)
327
333
  return false unless worker_name.present? && server_name.present?
334
+
328
335
  worker_name.start_with?(server_name)
329
336
  end
330
337
  end
@@ -1,4 +1,4 @@
1
- require 'active_support/concern'
1
+ require "active_support/concern"
2
2
 
3
3
  module RocketJob
4
4
  module Plugins
@@ -9,38 +9,10 @@ module RocketJob
9
9
 
10
10
  included do
11
11
  # Store all job types in this collection
12
- store_in collection: 'rocket_job.jobs'
12
+ store_in collection: "rocket_job.jobs"
13
13
  end
14
14
 
15
15
  module ClassMethods
16
- # Retrieves the next job to work on in priority based order
17
- # and assigns it to this worker
18
- #
19
- # Returns nil if no jobs are available for processing
20
- #
21
- # Parameters
22
- # worker_name: [String]
23
- # Name of the worker that will be processing this job
24
- #
25
- # filter: [Hash]
26
- # Filter to apply to the query.
27
- # For example: to exclude jobs from being returned.
28
- #
29
- # Example:
30
- # # Skip any job ids from the job_ids_list
31
- # filter = {:id.nin => job_ids_list}
32
- # job = RocketJob::Job.rocket_job_retrieve('host:pid:worker', filter)
33
- def rocket_job_retrieve(worker_name, filter)
34
- SemanticLogger.silence(:info) do
35
- scheduled = {'$or' => [{run_at: nil}, {:run_at.lte => Time.now}]}
36
- working = {'$or' => [{state: :queued}, {state: :running, sub_state: :processing}]}
37
- query = self.and(working, scheduled)
38
- query = query.where(filter) unless filter.blank?
39
- update = {'$set' => {'worker_name' => worker_name, 'state' => 'running'}}
40
- query.sort(priority: 1, _id: 1).find_one_and_update(update, bypass_document_validation: true)
41
- end
42
- end
43
-
44
16
  # Returns [Hash<String:Integer>] of the number of jobs in each state
45
17
  # Queued jobs are separated into :queued_now and :scheduled
46
18
  # :queued_now are jobs that are awaiting processing and can be processed now.
@@ -73,14 +45,14 @@ module RocketJob
73
45
  collection.aggregate(
74
46
  [
75
47
  {
76
- '$group' => {
77
- _id: '$state',
78
- count: {'$sum' => 1}
48
+ "$group" => {
49
+ _id: "$state",
50
+ count: {"$sum" => 1}
79
51
  }
80
52
  }
81
53
  ]
82
54
  ).each do |result|
83
- counts[result['_id'].to_sym] = result['count']
55
+ counts[result["_id"].to_sym] = result["count"]
84
56
  end
85
57
 
86
58
  # Calculate :queued_now and :scheduled if there are queued jobs
@@ -101,6 +73,7 @@ module RocketJob
101
73
  # Set in-memory job to complete if `destroy_on_complete` and the job has been destroyed
102
74
  def reload
103
75
  return super unless destroy_on_complete
76
+
104
77
  begin
105
78
  super
106
79
  rescue ::Mongoid::Errors::DocumentNotFound
@@ -1,4 +1,4 @@
1
- require 'active_support/concern'
1
+ require "active_support/concern"
2
2
 
3
3
  module RocketJob
4
4
  module Plugins
@@ -126,7 +126,7 @@ module RocketJob
126
126
  exception.worker_name = worker_name
127
127
  else
128
128
  build_exception(
129
- class_name: 'RocketJob::JobException',
129
+ class_name: "RocketJob::JobException",
130
130
  message: exc_or_message,
131
131
  backtrace: [],
132
132
  worker_name: worker_name
@@ -134,8 +134,9 @@ module RocketJob
134
134
  end
135
135
  end
136
136
 
137
- def rocket_job_set_started_at
138
- self.started_at = Time.now
137
+ def rocket_job_set_started_at(worker_name = nil)
138
+ self.started_at = Time.now
139
+ self.worker_name = worker_name if worker_name
139
140
  end
140
141
 
141
142
  def rocket_job_mark_complete
@@ -1,4 +1,4 @@
1
- require 'active_support/concern'
1
+ require "active_support/concern"
2
2
 
3
3
  module RocketJob
4
4
  module Plugins
@@ -30,7 +30,6 @@ module RocketJob
30
30
 
31
31
  included do
32
32
  class_attribute :rocket_job_throttles
33
- self.rocket_job_throttles = []
34
33
  end
35
34
 
36
35
  module ClassMethods
@@ -40,6 +39,7 @@ module RocketJob
40
39
  # method_name: [Symbol]
41
40
  # Name of method to call to evaluate whether a throttle has been exceeded.
42
41
  # Note: Must return true or false.
42
+ #
43
43
  # filter: [Symbol|Proc]
44
44
  # Name of method to call to return the filter when the throttle has been exceeded.
45
45
  # Or, a block that will return the filter.
@@ -47,24 +47,24 @@ module RocketJob
47
47
  #
48
48
  # Note: Throttles are executed in the order they are defined.
49
49
  def define_throttle(method_name, filter: :throttle_filter_class)
50
- unless filter.is_a?(Symbol) || filter.is_a?(Proc)
51
- raise(ArgumentError, "Filter for #{method_name} must be a Symbol or Proc")
52
- end
53
- if throttle?(method_name)
54
- raise(ArgumentError, "Cannot define #{method_name} twice, undefine previous throttle first")
55
- end
56
-
57
- self.rocket_job_throttles += [ThrottleDefinition.new(method_name, filter)]
50
+ # Duplicate to prevent modifying parent class throttles
51
+ definitions = rocket_job_throttles ? rocket_job_throttles.dup : ThrottleDefinitions.new
52
+ definitions.add(method_name, filter)
53
+ self.rocket_job_throttles = definitions
58
54
  end
59
55
 
60
56
  # Undefine a previously defined throttle
61
57
  def undefine_throttle(method_name)
62
- rocket_job_throttles.delete_if { |throttle| throttle.method_name == method_name }
58
+ return unless rocket_job_throttles
59
+
60
+ definitions = rocket_job_throttles.dup
61
+ definitions.remove(method_name)
62
+ self.rocket_job_throttles = definitions
63
63
  end
64
64
 
65
65
  # Has a throttle been defined?
66
66
  def throttle?(method_name)
67
- rocket_job_throttles.any? { |throttle| throttle.method_name == method_name }
67
+ rocket_job_throttles&.exist?(method_name)
68
68
  end
69
69
  end
70
70
 
@@ -81,22 +81,6 @@ module RocketJob
81
81
  def throttle_filter_id
82
82
  {:id.nin => [id]}
83
83
  end
84
-
85
- private
86
-
87
- ThrottleDefinition = Struct.new(:method_name, :filter)
88
-
89
- # Returns the matching filter, or nil if no throttles were triggered.
90
- def rocket_job_evaluate_throttles
91
- rocket_job_throttles.each do |throttle|
92
- # Throttle exceeded?
93
- next unless send(throttle.method_name)
94
- logger.debug { "Throttle: #{throttle.method_name} has been exceeded. #{self.class.name}:#{id}" }
95
- filter = throttle.filter
96
- return filter.is_a?(Proc) ? filter.call(self) : send(filter)
97
- end
98
- nil
99
- end
100
84
  end
101
85
  end
102
86
  end
@@ -1,4 +1,4 @@
1
- require 'active_support/concern'
1
+ require "active_support/concern"
2
2
 
3
3
  module RocketJob
4
4
  module Plugins
@@ -40,7 +40,7 @@ module RocketJob
40
40
 
41
41
  # Cannot use this class since it will include instances of parent job classes.
42
42
  RocketJob::Job.with(read: {mode: :primary}) do |conn|
43
- conn.running.where('_type' => self.class.name, :id.ne => id).count >= throttle_running_jobs
43
+ conn.running.where("_type" => self.class.name, :id.ne => id).count >= throttle_running_jobs
44
44
  end
45
45
  end
46
46
  end
@@ -1,4 +1,4 @@
1
- require 'active_support/concern'
1
+ require "active_support/concern"
2
2
 
3
3
  # Worker behavior for a job
4
4
  module RocketJob
@@ -23,41 +23,6 @@ module RocketJob
23
23
  job
24
24
  end
25
25
 
26
- # Returns the next job to work on in priority based order
27
- # Returns nil if there are currently no queued jobs, or processing batch jobs
28
- # with records that require processing
29
- #
30
- # Parameters
31
- # worker_name [String]
32
- # Name of the worker that will be processing this job
33
- #
34
- # skip_job_ids [Array<BSON::ObjectId>]
35
- # Job ids to exclude when looking for the next job
36
- #
37
- # Note:
38
- # If a job is in queued state it will be started
39
- def rocket_job_next_job(worker_name, filter = {})
40
- while (job = rocket_job_retrieve(worker_name, filter))
41
- # Batch Job?
42
- return job if job.running?
43
-
44
- if job.expired?
45
- job.rocket_job_fail_on_exception!(worker_name) { job.destroy }
46
- logger.info "Destroyed expired job #{job.class.name}, id:#{job.id}"
47
- elsif (new_filter = job.send(:rocket_job_evaluate_throttles))
48
- rocket_job_merge_filter(filter, new_filter)
49
- # Restore retrieved job so that other workers can process it later
50
- job.set(worker_name: nil, state: :queued)
51
- else
52
- job.worker_name = worker_name
53
- job.rocket_job_fail_on_exception!(worker_name) do
54
- job.start!
55
- end
56
- return job if job.running?
57
- end
58
- end
59
- end
60
-
61
26
  # Requeues all jobs that were running on a server that died
62
27
  def requeue_dead_server(server_name)
63
28
  # Need to requeue paused, failed since user may have transitioned job before it finished
@@ -67,20 +32,6 @@ module RocketJob
67
32
  end
68
33
  end
69
34
  end
70
-
71
- private
72
-
73
- def rocket_job_merge_filter(target, source)
74
- source.each_pair do |k, v|
75
- target[k] =
76
- if (previous = target[k])
77
- v.is_a?(Array) ? previous + v : v
78
- else
79
- v
80
- end
81
- end
82
- target
83
- end
84
35
  end
85
36
 
86
37
  # Runs the job now in the current thread.
@@ -112,38 +63,38 @@ module RocketJob
112
63
  #
113
64
  # The job is automatically saved only if an exception is raised in the supplied block.
114
65
  #
115
- # worker_name: [String]
116
- # Name of the server on which the exception has occurred
117
- #
118
66
  # re_raise_exceptions: [true|false]
119
67
  # Re-raise the exception after updating the job
120
68
  # Default: false
121
- def rocket_job_fail_on_exception!(worker_name, re_raise_exceptions = false)
122
- yield
123
- rescue Exception => exc
124
- if failed? || !may_fail?
125
- self.exception = JobException.from_exception(exc)
126
- exception.worker_name = worker_name
127
- save! unless new_record? || destroyed?
128
- elsif new_record? || destroyed?
129
- fail(worker_name, exc)
130
- else
131
- fail!(worker_name, exc)
69
+ def fail_on_exception!(re_raise_exceptions = false, &block)
70
+ SemanticLogger.named_tagged(job: id.to_s, &block)
71
+ rescue Exception => e
72
+ SemanticLogger.named_tagged(job: id.to_s) do
73
+ if failed? || !may_fail?
74
+ self.exception = JobException.from_exception(e)
75
+ exception.worker_name = worker_name
76
+ save! unless new_record? || destroyed?
77
+ elsif new_record? || destroyed?
78
+ fail(worker_name, e)
79
+ else
80
+ fail!(worker_name, e)
81
+ end
82
+ raise e if re_raise_exceptions
132
83
  end
133
- raise exc if re_raise_exceptions
134
84
  end
135
85
 
136
86
  # Works on this job
137
87
  #
138
- # Returns [true|false] whether this job should be excluded from the next lookup
88
+ # Returns [true|false] whether any work was performed.
139
89
  #
140
90
  # If an exception is thrown the job is marked as failed and the exception
141
91
  # is set in the job itself.
142
92
  #
143
93
  # Thread-safe, can be called by multiple threads at the same time
144
- def rocket_job_work(worker, re_raise_exceptions = false, _filter = nil)
145
- raise(ArgumentError, 'Job must be started before calling #rocket_job_work') unless running?
146
- rocket_job_fail_on_exception!(worker.name, re_raise_exceptions) do
94
+ def rocket_job_work(_worker, re_raise_exceptions = false)
95
+ raise(ArgumentError, "Job must be started before calling #rocket_job_work") unless running?
96
+
97
+ fail_on_exception!(re_raise_exceptions) do
147
98
  if _perform_callbacks.empty?
148
99
  @rocket_job_output = perform
149
100
  else
@@ -156,7 +107,7 @@ module RocketJob
156
107
 
157
108
  if collect_output?
158
109
  # Result must be a Hash, if not put it in a Hash
159
- self.result = @rocket_job_output.is_a?(Hash) ? @rocket_job_output : {'result' => @rocket_job_output}
110
+ self.result = @rocket_job_output.is_a?(Hash) ? @rocket_job_output : {"result" => @rocket_job_output}
160
111
  end
161
112
 
162
113
  if new_record? || destroyed?
@@ -171,6 +122,7 @@ module RocketJob
171
122
  # Returns [Hash<String:[Array<ActiveWorker>]>] All servers actively working on this job
172
123
  def rocket_job_active_workers(server_name = nil)
173
124
  return [] if !running? || (server_name && !worker_on_server?(server_name))
125
+
174
126
  [ActiveWorker.new(worker_name, started_at, self)]
175
127
  end
176
128
  end