rocketjob 3.4.3 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +27 -0
  3. data/bin/rocketjob +1 -1
  4. data/lib/rocket_job/active_worker.rb +4 -3
  5. data/lib/rocket_job/cli.rb +13 -12
  6. data/lib/rocket_job/config.rb +17 -13
  7. data/lib/rocket_job/dirmon_entry.rb +88 -91
  8. data/lib/rocket_job/extensions/mongo/logging.rb +8 -4
  9. data/lib/rocket_job/extensions/mongoid/factory.rb +8 -6
  10. data/lib/rocket_job/extensions/rocket_job_adapter.rb +2 -4
  11. data/lib/rocket_job/heartbeat.rb +7 -8
  12. data/lib/rocket_job/job_exception.rb +6 -5
  13. data/lib/rocket_job/jobs/dirmon_job.rb +5 -7
  14. data/lib/rocket_job/jobs/housekeeping_job.rb +3 -2
  15. data/lib/rocket_job/jobs/on_demand_job.rb +104 -0
  16. data/lib/rocket_job/jobs/simple_job.rb +0 -2
  17. data/lib/rocket_job/jobs/upload_file_job.rb +100 -0
  18. data/lib/rocket_job/performance.rb +15 -10
  19. data/lib/rocket_job/plugins/cron.rb +7 -124
  20. data/lib/rocket_job/plugins/document.rb +8 -10
  21. data/lib/rocket_job/plugins/job/callbacks.rb +0 -1
  22. data/lib/rocket_job/plugins/job/logger.rb +0 -1
  23. data/lib/rocket_job/plugins/job/model.rb +15 -20
  24. data/lib/rocket_job/plugins/job/persistence.rb +3 -13
  25. data/lib/rocket_job/plugins/job/state_machine.rb +1 -2
  26. data/lib/rocket_job/plugins/job/throttle.rb +16 -12
  27. data/lib/rocket_job/plugins/job/worker.rb +15 -19
  28. data/lib/rocket_job/plugins/processing_window.rb +2 -2
  29. data/lib/rocket_job/plugins/restart.rb +3 -4
  30. data/lib/rocket_job/plugins/retry.rb +2 -3
  31. data/lib/rocket_job/plugins/singleton.rb +2 -3
  32. data/lib/rocket_job/plugins/state_machine.rb +19 -23
  33. data/lib/rocket_job/rocket_job.rb +4 -5
  34. data/lib/rocket_job/server.rb +35 -41
  35. data/lib/rocket_job/version.rb +2 -2
  36. data/lib/rocket_job/worker.rb +22 -21
  37. data/lib/rocketjob.rb +2 -0
  38. data/test/config/mongoid.yml +2 -2
  39. data/test/config_test.rb +0 -2
  40. data/test/dirmon_entry_test.rb +161 -134
  41. data/test/dirmon_job_test.rb +80 -78
  42. data/test/job_test.rb +0 -2
  43. data/test/jobs/housekeeping_job_test.rb +0 -1
  44. data/test/jobs/on_demand_job_test.rb +59 -0
  45. data/test/jobs/upload_file_job_test.rb +99 -0
  46. data/test/plugins/cron_test.rb +1 -3
  47. data/test/plugins/job/callbacks_test.rb +8 -13
  48. data/test/plugins/job/defaults_test.rb +0 -1
  49. data/test/plugins/job/logger_test.rb +2 -4
  50. data/test/plugins/job/model_test.rb +1 -2
  51. data/test/plugins/job/persistence_test.rb +0 -2
  52. data/test/plugins/job/state_machine_test.rb +0 -2
  53. data/test/plugins/job/throttle_test.rb +6 -8
  54. data/test/plugins/job/worker_test.rb +1 -2
  55. data/test/plugins/processing_window_test.rb +0 -2
  56. data/test/plugins/restart_test.rb +0 -1
  57. data/test/plugins/retry_test.rb +1 -2
  58. data/test/plugins/singleton_test.rb +0 -2
  59. data/test/plugins/state_machine_event_callbacks_test.rb +1 -2
  60. data/test/plugins/state_machine_test.rb +0 -2
  61. data/test/plugins/transaction_test.rb +5 -7
  62. data/test/test_db.sqlite3 +0 -0
  63. data/test/test_helper.rb +2 -1
  64. metadata +42 -36
@@ -2,129 +2,7 @@ require 'active_support/concern'
2
2
 
3
3
  module RocketJob
4
4
  module Plugins
5
- # Automatically schedules the job to start based on the supplied `cron_schedule`.
6
- # Once started the job will automatically restart on completion and will only run again
7
- # according to the `cron_schedule`.
8
- # Failed jobs are aborted so that they cannot be restarted since a new instance has already
9
- # been enqueued.
10
- #
11
- # Include RocketJob::Plugins::Singleton to prevent multiple copies of the job from running at
12
- # the same time.
13
- #
14
- # Unlike cron, if a job is already running, another one is not queued when the cron
15
- # schedule needs another started, but rather on completion of the current job. This prevents
16
- # multiple instances of the same job from running at the same time. The next instance of the
17
- # job is only scheduled on completion of the current job instance.
18
- #
19
- # For example if the job takes 10 minutes to complete, and is scheduled to run every 5 minutes,
20
- # it will only be run every 10 minutes.
21
- #
22
- # Their is no centralized scheduler or need to start schedulers anywhere, since the jobs
23
- # can be picked up by any Rocket Job worker. Once processing is complete a new instance is then
24
- # automatically scheduled based on the `cron_schedule`.
25
- #
26
- # A job is only queued to run at the specified `cron_schedule`, it will only run if there are workers
27
- # available to run. For example if workers are busy working on higher priority jobs, then the job
28
- # will only run once those jobs have completed, or their priority lowered. Additionally, while the
29
- # job is queued no additional instances will be enqueued, even if the next cron interval has been reached.
30
- #
31
- # Notes:
32
- # - The job will not be restarted if:
33
- # - A validation fails after cloning this job.
34
- # - The job has expired.
35
- # - Any time the `cron_schedule` is changed, the `run_at` is automatically set before saving the changes.
36
- # - However, if the `run_at` is explicitly set then it will not be overridden.
37
- # - `cron_schedule` is not a required field so that the same job class
38
- # - can be scheduled to run at regular intervals,
39
- # - and run on an ad-hoc basis with custom values.
40
- # - On job failure
41
- # - a new future instance is created immediately.
42
- # - the current instance is marked as failed and its cron schedule is set to nil.
43
- # - Prevents the failed instance from creating a new future instance when it completes.
44
- #
45
- # Example, schedule the job to run at regular intervals:
46
- #
47
- # class MyCronJob < RocketJob::Job
48
- # include RocketJob::Plugins::Cron
49
- #
50
- # # Set the default cron_schedule
51
- # self.cron_schedule = "* 1 * * * UTC"
52
- #
53
- # def perform
54
- # puts "DONE"
55
- # end
56
- # end
57
- #
58
- # # Queue the job for processing using the default cron_schedule specified above.
59
- # MyCronJob.create!
60
- #
61
- #
62
- # Example, a job that can run at regular intervals, and can be run for ad-hoc reporting etc.:
63
- #
64
- # class ReportJob < RocketJob::Job
65
- # # Do not set a default cron_schedule so that the job can also be used for ad-hoc work.
66
- # include RocketJob::Plugins::Cron
67
- #
68
- # field :start_date, type: Date
69
- # field :end_date, type: Date
70
- #
71
- # def perform
72
- # # Uses `scheduled_at` to take into account any possible delays.
73
- # self.start_at ||= scheduled_at.beginning_of_week.to_date
74
- # self.end_at ||= scheduled_at.end_of_week.to_date
75
- #
76
- # puts "Running report, starting at #{start_date}, ending at #{end_date}"
77
- # end
78
- # end
79
- #
80
- # # Queue the job for processing using a cron_schedule.
81
- # # On completion the job will create a new instance to run at a future date.
82
- # ReportJob.create!(cron_schedule: '* 1 * * * America/New_York')
83
- #
84
- # # Queue the job for processing outside of the above cron schedule.
85
- # # On completion the job will _not_ create a new instance to run at a future date.
86
- # job = ReportJob.create!(start_date: 30.days.ago, end_date: 10.days.ago)
87
- #
88
- #
89
- # To prevent multiple instances of the job from running at the same time, add the singleton plug-in:
90
- # include RocketJob::Plugins::Singleton
91
- #
92
- # Example: Only allow one instance of this job to be active at the same time (running, queued, scheduled, or failed):
93
- #
94
- # class MyCronJob < RocketJob::Job
95
- # # Add `cron_schedule`
96
- # include RocketJob::Plugins::Cron
97
- # # Prevents mutiple instances from being queued or run at the same time
98
- # include RocketJob::Plugins::Singleton
99
- #
100
- # # Set the default cron_schedule
101
- # self.cron_schedule = "* 1 * * * UTC"
102
- #
103
- # def perform
104
- # puts "DONE"
105
- # end
106
- # end
107
- #
108
- # Note: The cron_schedule field is formatted as follows:
109
- #
110
- # * * * * * *
111
- # ┬ ┬ ┬ ┬ ┬ ┬
112
- # │ │ │ │ │ │
113
- # │ │ │ │ │ └ Optional: Timezone, for example: 'America/New_York', 'UTC'
114
- # │ │ │ │ └───── day_of_week (0-7) (0 or 7 is Sun, or use 3-letter names)
115
- # │ │ │ └────────── month (1-12, or use 3-letter names)
116
- # │ │ └─────────────── day_of_month (1-31)
117
- # │ └──────────────────── hour (0-23)
118
- # └───────────────────────── minute (0-59)
119
- #
120
- # * When specifying day of week, both day 0 and day 7 is Sunday.
121
- # * Ranges & Lists of numbers are allowed.
122
- # * Ranges or lists of names are not allowed.
123
- # * Ranges can include 'steps', so `1-9/2` is the same as `1,3,5,7,9`.
124
- # * Months or days of the week can be specified by name.
125
- # * Use the first three letters of the particular day or month (case doesn't matter).
126
- # * The timezone is recommended to prevent any issues with possible default timezone
127
- # differences across servers, or environments.
5
+ # Schedule jobs to run at set intervals.
128
6
  module Cron
129
7
  extend ActiveSupport::Concern
130
8
 
@@ -176,6 +54,12 @@ module RocketJob
176
54
  run_at || created_at
177
55
  end
178
56
 
57
+ # Make this job run now, regardless of the cron schedule.
58
+ # Upon completion the job will automatically reschedule itself.
59
+ def run_now!
60
+ update_attributes(run_at: nil) if cron_schedule
61
+ end
62
+
179
63
  # Returns [Time] the next time this job will be scheduled to run at.
180
64
  #
181
65
  # Parameters
@@ -192,7 +76,6 @@ module RocketJob
192
76
  return unless cron_schedule
193
77
  self.run_at = rocket_job_cron_next_time if cron_schedule_changed? && !run_at_changed?
194
78
  end
195
-
196
79
  end
197
80
  end
198
81
  end
@@ -34,17 +34,15 @@ module RocketJob
34
34
  # Apply changes to this document returning the updated document from the database.
35
35
  # Allows other changes to be made on the server that will be loaded.
36
36
  def find_and_update(attrs)
37
- if doc = collection.find(_id: id).find_one_and_update({'$set' => attrs}, return_document: :after)
38
- # Clear out keys that are not returned during the reload from MongoDB
39
- (fields.keys + embedded_relations.keys - doc.keys).each { |key| send("#{key}=", nil) }
40
- @attributes = doc
41
- apply_defaults
42
- self
43
- else
44
- raise(Mongoid::Errors::DocumentNotFound.new(self.class, id))
45
- end
37
+ doc = collection.find(_id: id).find_one_and_update({'$set' => attrs}, return_document: :after)
38
+ raise(Mongoid::Errors::DocumentNotFound.new(self.class, id)) unless doc
39
+
40
+ # Clear out keys that are not returned during the reload from MongoDB
41
+ (fields.keys + embedded_relations.keys - doc.keys).each { |key| send("#{key}=", nil) }
42
+ @attributes = doc
43
+ apply_defaults
44
+ self
46
45
  end
47
-
48
46
  end
49
47
  end
50
48
  end
@@ -84,7 +84,6 @@ module RocketJob
84
84
  set_callback(:perform, :around, *filters, &blk)
85
85
  end
86
86
  end
87
-
88
87
  end
89
88
  end
90
89
  end
@@ -28,7 +28,6 @@ module RocketJob
28
28
  &block
29
29
  )
30
30
  end
31
-
32
31
  end
33
32
  end
34
33
  end
@@ -9,7 +9,7 @@ module RocketJob
9
9
 
10
10
  included do
11
11
  # Fields that are end user editable.
12
- # For example are editable in Rocket Job Mission Control.
12
+ # For example are editable in Rocket Job Web Interface.
13
13
  class_attribute :user_editable_fields, instance_accessor: false
14
14
  self.user_editable_fields = []
15
15
 
@@ -156,7 +156,7 @@ module RocketJob
156
156
  # Scope for queued jobs that can run now
157
157
  # I.e. Queued jobs excluding scheduled jobs
158
158
  def queued_now
159
- queued.or({:run_at => nil}, {:run_at.lte => Time.now})
159
+ queued.or({run_at: nil}, :run_at.lte => Time.now)
160
160
  end
161
161
 
162
162
  # Defines all the fields that are accessible on the Document
@@ -182,10 +182,8 @@ module RocketJob
182
182
  end
183
183
  if options.delete(:class_attribute) == true
184
184
  class_attribute(name, instance_accessor: false)
185
- if options.has_key?(:default)
186
- public_send("#{name}=", options[:default])
187
- end
188
- options[:default] = lambda { self.class.public_send(name) }
185
+ public_send("#{name}=", options[:default]) if options.key?(:default)
186
+ options[:default] = -> { self.class.public_send(name) }
189
187
  end
190
188
  if options.delete(:copy_on_restart) == true
191
189
  self.rocket_job_restart_attributes += [name.to_sym] unless rocket_job_restart_attributes.include?(name.to_sym)
@@ -248,7 +246,7 @@ module RocketJob
248
246
  # Return [true|false] whether this job is sleeping.
249
247
  # I.e. No workers currently working on this job even if it is running.
250
248
  def sleeping?
251
- running? && (worker_count == 0)
249
+ running? && worker_count.zero?
252
250
  end
253
251
 
254
252
  # Returns [Integer] the number of workers currently working on this job.
@@ -263,32 +261,31 @@ module RocketJob
263
261
 
264
262
  # Returns [Hash] status of this job
265
263
  def as_json
266
- attrs = serializable_hash(methods: [:seconds, :duration])
264
+ attrs = serializable_hash(methods: %i[seconds duration])
267
265
  attrs.delete('result') unless collect_output?
268
- attrs.delete('failure_count') unless failure_count > 0
269
- case
270
- when queued?
266
+ attrs.delete('failure_count') unless failure_count.positive?
267
+ if queued?
271
268
  attrs.delete('started_at')
272
269
  attrs.delete('completed_at')
273
270
  attrs.delete('result')
274
271
  attrs
275
- when running?
272
+ elsif running?
276
273
  attrs.delete('completed_at')
277
274
  attrs.delete('result')
278
275
  attrs
279
- when completed?
276
+ elsif completed?
280
277
  attrs.delete('percent_complete')
281
278
  attrs
282
- when paused?
279
+ elsif paused?
283
280
  attrs.delete('completed_at')
284
281
  attrs.delete('result')
285
282
  # Ensure 'paused_at' appears first in the hash
286
283
  {'paused_at' => completed_at}.merge(attrs)
287
- when aborted?
284
+ elsif aborted?
288
285
  attrs.delete('completed_at')
289
286
  attrs.delete('result')
290
287
  {'aborted_at' => completed_at}.merge(attrs)
291
- when failed?
288
+ elsif failed?
292
289
  attrs.delete('completed_at')
293
290
  attrs.delete('result')
294
291
  {'failed_at' => completed_at}.merge(attrs)
@@ -302,10 +299,9 @@ module RocketJob
302
299
  h = as_json
303
300
  h.delete('seconds')
304
301
  h.dup.each_pair do |k, v|
305
- case
306
- when v.is_a?(Time)
302
+ if v.is_a?(Time)
307
303
  h[k] = v.in_time_zone(time_zone).to_s
308
- when v.is_a?(BSON::ObjectId)
304
+ elsif v.is_a?(BSON::ObjectId)
309
305
  h[k] = v.to_s
310
306
  end
311
307
  end
@@ -317,7 +313,6 @@ module RocketJob
317
313
  return false unless worker_name.present? && server_name.present?
318
314
  worker_name.start_with?(server_name)
319
315
  end
320
-
321
316
  end
322
317
  end
323
318
  end
@@ -10,8 +10,6 @@ module RocketJob
10
10
  included do
11
11
  # Store all job types in this collection
12
12
  store_in collection: 'rocket_job.jobs'
13
-
14
- after_initialize :remove_arguments
15
13
  end
16
14
 
17
15
  module ClassMethods
@@ -84,11 +82,11 @@ module RocketJob
84
82
  end
85
83
 
86
84
  # Calculate :queued_now and :scheduled if there are queued jobs
87
- if queued_count = counts[:queued]
85
+ if (queued_count = counts[:queued])
88
86
  scheduled_count = RocketJob::Job.scheduled.count
89
- if scheduled_count > 0
87
+ if scheduled_count.positive?
90
88
  queued_now_count = queued_count - scheduled_count
91
- counts[:queued_now] = queued_count - scheduled_count if queued_now_count > 0
89
+ counts[:queued_now] = queued_count - scheduled_count if queued_now_count.positive?
92
90
  counts[:scheduled] = scheduled_count
93
91
  else
94
92
  counts[:queued_now] = queued_count
@@ -112,14 +110,6 @@ module RocketJob
112
110
  self
113
111
  end
114
112
  end
115
-
116
- private
117
-
118
- # Remove old style arguments that were stored as an array
119
- def remove_arguments
120
- attributes.delete('arguments') unless respond_to?('arguments='.to_sym)
121
- end
122
-
123
113
  end
124
114
  end
125
115
  end
@@ -78,7 +78,7 @@ module RocketJob
78
78
 
79
79
  event :requeue do
80
80
  transitions from: :running, to: :queued,
81
- if: -> server_name { worker_on_server?(server_name) },
81
+ if: ->(server_name) { worker_on_server?(server_name) },
82
82
  after: :rocket_job_clear_started_at
83
83
  end
84
84
  end
@@ -165,7 +165,6 @@ module RocketJob
165
165
  destroy if destroy_on_complete && !new_record?
166
166
  end
167
167
  end
168
-
169
168
  end
170
169
  end
171
170
  end
@@ -47,21 +47,28 @@ 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
- raise(ArgumentError, "Filter for #{method_name} must be a Symbol or Proc") unless filter.is_a?(Symbol) || filter.is_a?(Proc)
51
- raise(ArgumentError, "Cannot define #{method_name} twice, undefine previous throttle first") if has_throttle?(method_name)
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
52
56
 
53
57
  self.rocket_job_throttles += [ThrottleDefinition.new(method_name, filter)]
54
58
  end
55
59
 
56
60
  # Undefine a previously defined throttle
57
- def undefine_throttle(method_name)
58
- rocket_job_throttles.delete_if { |throttle| throttle.method_name }
61
+ def undefine_throttle(_method_name)
62
+ rocket_job_throttles.delete_if(&:method_name)
59
63
  end
60
64
 
61
65
  # Has a throttle been defined?
62
- def has_throttle?(method_name)
66
+ def throttle?(method_name)
63
67
  rocket_job_throttles.find { |throttle| throttle.method_name == method_name }
64
68
  end
69
+
70
+ # DEPRECATED
71
+ alias has_throttle? throttle?
65
72
  end
66
73
 
67
74
  # Default throttle to use when the throttle is exceeded.
@@ -86,17 +93,14 @@ module RocketJob
86
93
  def rocket_job_evaluate_throttles
87
94
  rocket_job_throttles.each do |throttle|
88
95
  # Throttle exceeded?
89
- if send(throttle.method_name)
90
- logger.debug { "Throttle: #{throttle.method_name} has been exceeded. #{self.class.name}:#{id}" }
91
- filter = throttle.filter
92
- return filter.is_a?(Proc) ? filter.call(self) : send(filter)
93
- end
96
+ next unless send(throttle.method_name)
97
+ logger.debug { "Throttle: #{throttle.method_name} has been exceeded. #{self.class.name}:#{id}" }
98
+ filter = throttle.filter
99
+ return filter.is_a?(Proc) ? filter.call(self) : send(filter)
94
100
  end
95
101
  nil
96
102
  end
97
-
98
103
  end
99
-
100
104
  end
101
105
  end
102
106
  end
@@ -10,15 +10,15 @@ module RocketJob
10
10
  module ClassMethods
11
11
  # Run this job now.
12
12
  #
13
- # The job is not saved to the database since it is processed entriely in memory
13
+ # The job is not saved to the database since it is processed entirely in memory
14
14
  # As a result before_save and before_destroy callbacks will not be called.
15
15
  # Validations are still called however prior to calling #perform
16
16
  #
17
17
  # Note:
18
18
  # - Only batch throttles are checked when perform_now is called.
19
- def perform_now(args, &block)
19
+ def perform_now(args)
20
20
  job = new(args)
21
- block.call(job) if block
21
+ yield(job) if block_given?
22
22
  job.perform_now
23
23
  job
24
24
  end
@@ -38,14 +38,13 @@ module RocketJob
38
38
  # If a job is in queued state it will be started
39
39
  def rocket_job_next_job(worker_name, filter = {})
40
40
  while (job = rocket_job_retrieve(worker_name, filter))
41
- case
42
- when job.running?
43
- # Batch Job
44
- return job
45
- when job.expired?
41
+ # Batch Job?
42
+ return job if job.running?
43
+
44
+ if job.expired?
46
45
  job.rocket_job_fail_on_exception!(worker_name) { job.destroy }
47
46
  logger.info "Destroyed expired job #{job.class.name}, id:#{job.id}"
48
- when new_filter = job.send(:rocket_job_evaluate_throttles)
47
+ elsif (new_filter = job.send(:rocket_job_evaluate_throttles))
49
48
  rocket_job_merge_filter(filter, new_filter)
50
49
  # Restore retrieved job so that other workers can process it later
51
50
  job.set(worker_name: nil, state: :queued)
@@ -62,7 +61,7 @@ module RocketJob
62
61
  # Requeues all jobs that were running on a server that died
63
62
  def requeue_dead_server(server_name)
64
63
  # Need to requeue paused, failed since user may have transitioned job before it finished
65
- where(:state.in => [:running, :paused, :failed]).each do |job|
64
+ where(:state.in => %i[running paused failed]).each do |job|
66
65
  job.requeue!(server_name) if job.may_requeue?(server_name)
67
66
  end
68
67
  end
@@ -73,7 +72,7 @@ module RocketJob
73
72
  perform_now(args, &block)
74
73
  else
75
74
  job = new(args)
76
- block.call(job) if block
75
+ yield(job) if block
77
76
  job.save!
78
77
  job
79
78
  end
@@ -84,7 +83,7 @@ module RocketJob
84
83
  def rocket_job_merge_filter(target, source)
85
84
  source.each_pair do |k, v|
86
85
  target[k] =
87
- if previous = target[k]
86
+ if (previous = target[k])
88
87
  v.is_a?(Array) ? previous + v : v
89
88
  else
90
89
  v
@@ -136,12 +135,10 @@ module RocketJob
136
135
  self.exception = JobException.from_exception(exc)
137
136
  exception.worker_name = worker_name
138
137
  save! unless new_record? || destroyed?
138
+ elsif new_record? || destroyed?
139
+ fail(worker_name, exc)
139
140
  else
140
- if new_record? || destroyed?
141
- fail(worker_name, exc)
142
- else
143
- fail!(worker_name, exc)
144
- end
141
+ fail!(worker_name, exc)
145
142
  end
146
143
  raise exc if re_raise_exceptions
147
144
  end
@@ -154,7 +151,7 @@ module RocketJob
154
151
  # is set in the job itself.
155
152
  #
156
153
  # Thread-safe, can be called by multiple threads at the same time
157
- def rocket_job_work(worker, re_raise_exceptions = false, filter = nil)
154
+ def rocket_job_work(worker, re_raise_exceptions = false, _filter = nil)
158
155
  raise(ArgumentError, 'Job must be started before calling #rocket_job_work') unless running?
159
156
  rocket_job_fail_on_exception!(worker.name, re_raise_exceptions) do
160
157
  if _perform_callbacks.empty?
@@ -186,7 +183,6 @@ module RocketJob
186
183
  return [] if !running? || (server_name && !worker_on_server?(server_name))
187
184
  [ActiveWorker.new(worker_name, started_at, self)]
188
185
  end
189
-
190
186
  end
191
187
  end
192
188
  end