lib/rocket_job/plugins/job/persistence.rb in rocketjob-6.0.0.rc3 vs lib/rocket_job/plugins/job/persistence.rb in rocketjob-6.0.0
- old
+ new
@@ -68,10 +68,33 @@
end
counts
end
end
+ # Create a new instance of this job, copying across only the `copy_on_restart` attributes.
+ # Copy across input and output categories to new scheduled job so that all of the
+ # settings are remembered between instance. Example: slice_size
+ def create_restart!(**overrides)
+ if expired?
+ logger.info("Job has expired. Not creating a new instance.")
+ return
+ end
+
+ job_attrs = self.class.rocket_job_restart_attributes.each_with_object({}) do |attr, attrs|
+ attrs[attr] = send(attr)
+ end
+ job_attrs.merge!(overrides)
+
+ job = self.class.new(job_attrs)
+ job.input_categories = input_categories if respond_to?(:input_categories)
+ job.output_categories = output_categories if respond_to?(:output_categories)
+
+ job.save_with_retry!
+
+ logger.info("Created a new job instance: #{job.id}")
+ end
+
# Set in-memory job to complete if `destroy_on_complete` and the job has been destroyed
def reload
return super unless destroy_on_complete
begin
@@ -82,9 +105,22 @@
rocket_job_set_completed_at
rocket_job_mark_complete
end
self
end
+ end
+
+ # Save with retry in case persistence takes a moment.
+ def save_with_retry!(retry_limit = 10, sleep_interval = 0.5)
+ count = 0
+ while count < retry_limit
+ return true if save
+
+ logger.info("Retrying to persist new scheduled instance: #{errors.messages.inspect}")
+ sleep(sleep_interval)
+ count += 1
+ end
+ save!
end
end
end
end
end