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.
- checksums.yaml +4 -4
- data/bin/rocketjob +2 -2
- data/bin/rocketjob_batch_perf +1 -1
- data/bin/rocketjob_perf +1 -1
- data/lib/rocket_job/active_worker.rb +1 -0
- data/lib/rocket_job/batch.rb +16 -17
- data/lib/rocket_job/batch/callbacks.rb +1 -2
- data/lib/rocket_job/batch/io.rb +10 -6
- data/lib/rocket_job/batch/logger.rb +2 -2
- data/lib/rocket_job/batch/lower_priority.rb +2 -2
- data/lib/rocket_job/batch/model.rb +23 -23
- data/lib/rocket_job/batch/performance.rb +19 -21
- data/lib/rocket_job/batch/result.rb +1 -1
- data/lib/rocket_job/batch/results.rb +1 -1
- data/lib/rocket_job/batch/state_machine.rb +5 -6
- data/lib/rocket_job/batch/statistics.rb +10 -8
- data/lib/rocket_job/batch/tabular.rb +2 -2
- data/lib/rocket_job/batch/tabular/input.rb +11 -7
- data/lib/rocket_job/batch/tabular/output.rb +1 -1
- data/lib/rocket_job/batch/throttle.rb +11 -30
- data/lib/rocket_job/batch/{throttle_running_slices.rb → throttle_running_workers.rb} +13 -10
- data/lib/rocket_job/batch/worker.rb +102 -85
- data/lib/rocket_job/cli.rb +57 -54
- data/lib/rocket_job/config.rb +8 -10
- data/lib/rocket_job/dirmon_entry.rb +13 -10
- data/lib/rocket_job/event.rb +16 -16
- data/lib/rocket_job/extensions/mongo/logging.rb +2 -2
- data/lib/rocket_job/extensions/mongoid/clients/options.rb +2 -2
- data/lib/rocket_job/extensions/mongoid/contextual/mongo.rb +4 -2
- data/lib/rocket_job/extensions/mongoid/factory.rb +13 -5
- data/lib/rocket_job/extensions/rocket_job_adapter.rb +2 -1
- data/lib/rocket_job/job_exception.rb +0 -3
- data/lib/rocket_job/jobs/dirmon_job.rb +4 -4
- data/lib/rocket_job/jobs/housekeeping_job.rb +7 -7
- data/lib/rocket_job/jobs/on_demand_batch_job.rb +14 -4
- data/lib/rocket_job/jobs/on_demand_job.rb +3 -3
- data/lib/rocket_job/jobs/performance_job.rb +1 -1
- data/lib/rocket_job/jobs/re_encrypt/relational_job.rb +11 -10
- data/lib/rocket_job/jobs/upload_file_job.rb +9 -5
- data/lib/rocket_job/performance.rb +24 -22
- data/lib/rocket_job/plugins/cron.rb +7 -3
- data/lib/rocket_job/plugins/document.rb +7 -5
- data/lib/rocket_job/plugins/job/callbacks.rb +1 -1
- data/lib/rocket_job/plugins/job/logger.rb +3 -3
- data/lib/rocket_job/plugins/job/model.rb +34 -27
- data/lib/rocket_job/plugins/job/persistence.rb +7 -34
- data/lib/rocket_job/plugins/job/state_machine.rb +5 -4
- data/lib/rocket_job/plugins/job/throttle.rb +12 -28
- data/lib/rocket_job/plugins/job/throttle_running_jobs.rb +2 -2
- data/lib/rocket_job/plugins/job/worker.rb +22 -70
- data/lib/rocket_job/plugins/processing_window.rb +5 -4
- data/lib/rocket_job/plugins/restart.rb +3 -3
- data/lib/rocket_job/plugins/retry.rb +2 -2
- data/lib/rocket_job/plugins/singleton.rb +1 -2
- data/lib/rocket_job/plugins/state_machine.rb +4 -4
- data/lib/rocket_job/plugins/transaction.rb +1 -1
- data/lib/rocket_job/rocket_job.rb +5 -4
- data/lib/rocket_job/server.rb +2 -2
- data/lib/rocket_job/server/model.rb +14 -13
- data/lib/rocket_job/server/state_machine.rb +1 -2
- data/lib/rocket_job/sliced/compressed_slice.rb +4 -4
- data/lib/rocket_job/sliced/encrypted_slice.rb +4 -4
- data/lib/rocket_job/sliced/input.rb +16 -16
- data/lib/rocket_job/sliced/output.rb +2 -2
- data/lib/rocket_job/sliced/slice.rb +43 -20
- data/lib/rocket_job/sliced/slices.rb +14 -11
- data/lib/rocket_job/subscriber.rb +6 -6
- data/lib/rocket_job/subscribers/logger.rb +3 -3
- data/lib/rocket_job/supervisor.rb +12 -12
- data/lib/rocket_job/supervisor/shutdown.rb +7 -7
- data/lib/rocket_job/throttle_definition.rb +37 -0
- data/lib/rocket_job/throttle_definitions.rb +39 -0
- data/lib/rocket_job/version.rb +1 -1
- data/lib/rocket_job/worker.rb +116 -34
- data/lib/rocket_job/worker_pool.rb +6 -6
- data/lib/rocketjob.rb +72 -76
- metadata +16 -18
- data/lib/rocket_job/extensions/mongoid_5/clients/options.rb +0 -38
- data/lib/rocket_job/extensions/mongoid_5/contextual/mongo.rb +0 -64
- data/lib/rocket_job/extensions/mongoid_5/factory.rb +0 -13
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "mongo/monitoring/command_log_subscriber"
|
2
2
|
|
3
3
|
module Mongo
|
4
4
|
class Monitoring
|
5
5
|
class CommandLogSubscriber
|
6
6
|
include SemanticLogger::Loggable
|
7
|
-
logger.name =
|
7
|
+
logger.name = "Mongo"
|
8
8
|
|
9
9
|
def started(event)
|
10
10
|
@event_command = event.command
|
@@ -3,9 +3,11 @@ module Mongoid
|
|
3
3
|
module Contextual
|
4
4
|
class Mongo
|
5
5
|
def initialize(criteria)
|
6
|
-
@criteria
|
6
|
+
@criteria = criteria
|
7
|
+
@klass = criteria.klass
|
8
|
+
@cache = criteria.options[:cache]
|
7
9
|
# Only line changed is here, get collection name from criteria, not @klass
|
8
|
-
|
10
|
+
# @collection = @klass.collection
|
9
11
|
@collection = criteria.collection
|
10
12
|
|
11
13
|
criteria.send(:merge_type_selection)
|
@@ -1,12 +1,20 @@
|
|
1
|
-
require
|
1
|
+
require "mongoid/factory"
|
2
2
|
|
3
3
|
module RocketJob
|
4
4
|
# Don't convert to Mongoid::Factory since it conflicts with Mongoid use.
|
5
5
|
module MongoidFactory
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
if Mongoid::VERSION.to_f >= 7.1
|
7
|
+
def from_db(klass, attributes = nil, criteria = nil, selected_fields = nil)
|
8
|
+
obj = super(klass, attributes, criteria, selected_fields)
|
9
|
+
obj.collection_name = criteria.collection_name if criteria
|
10
|
+
obj
|
11
|
+
end
|
12
|
+
else
|
13
|
+
def from_db(klass, attributes = nil, criteria = nil)
|
14
|
+
obj = super(klass, attributes, criteria)
|
15
|
+
obj.collection_name = criteria.collection_name if criteria
|
16
|
+
obj
|
17
|
+
end
|
10
18
|
end
|
11
19
|
end
|
12
20
|
end
|
@@ -71,7 +71,7 @@ module ActiveJob
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def self.active_job_params(active_job)
|
74
|
-
params
|
74
|
+
params = {
|
75
75
|
description: active_job.class.name,
|
76
76
|
data: active_job.serialize,
|
77
77
|
active_job_id: active_job.job_id,
|
@@ -81,6 +81,7 @@ module ActiveJob
|
|
81
81
|
params[:priority] = active_job.priority if active_job.respond_to?(:priority) && active_job.priority
|
82
82
|
params
|
83
83
|
end
|
84
|
+
|
84
85
|
private_class_method :active_job_params
|
85
86
|
end
|
86
87
|
end
|
@@ -18,9 +18,6 @@ module RocketJob
|
|
18
18
|
# Name of the server on which this exception occurred
|
19
19
|
field :worker_name, type: String
|
20
20
|
|
21
|
-
# The record within which this exception occurred
|
22
|
-
field :record_number, type: Integer
|
23
|
-
|
24
21
|
# Returns [JobException] built from the supplied exception
|
25
22
|
def self.from_exception(exc, **args)
|
26
23
|
new(
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "fileutils"
|
2
2
|
module RocketJob
|
3
3
|
module Jobs
|
4
4
|
# Dirmon monitors folders for files matching the criteria specified in DirmonEntry
|
@@ -79,10 +79,10 @@ module RocketJob
|
|
79
79
|
end
|
80
80
|
|
81
81
|
# BSON Keys cannot contain periods
|
82
|
-
key
|
83
|
-
previous_size
|
82
|
+
key = iopath.to_s.tr(".", "_")
|
83
|
+
previous_size = previous_file_names[key]
|
84
84
|
# Check every few minutes for a file size change before trying to process the file.
|
85
|
-
size
|
85
|
+
size = check_file(entry, iopath, previous_size)
|
86
86
|
new_file_names[key] = size if size
|
87
87
|
end
|
88
88
|
end
|
@@ -30,9 +30,9 @@ module RocketJob
|
|
30
30
|
include RocketJob::Plugins::Singleton
|
31
31
|
|
32
32
|
self.priority = 25
|
33
|
-
self.description =
|
33
|
+
self.description = "Cleans out historical jobs, and zombie servers."
|
34
34
|
# Runs every 15 minutes
|
35
|
-
self.cron_schedule =
|
35
|
+
self.cron_schedule = "*/15 * * * * UTC"
|
36
36
|
|
37
37
|
# Whether to destroy zombie servers automatically
|
38
38
|
field :destroy_zombies, type: Boolean, default: true, user_editable: true, copy_on_restart: true
|
@@ -46,13 +46,13 @@ module RocketJob
|
|
46
46
|
field :queued_retention, type: Integer, user_editable: true, copy_on_restart: true
|
47
47
|
|
48
48
|
def perform
|
49
|
-
RocketJob::Job.aborted.where(completed_at: {
|
49
|
+
RocketJob::Job.aborted.where(completed_at: {"$lte" => aborted_retention.seconds.ago}).destroy_all if aborted_retention
|
50
50
|
if completed_retention
|
51
|
-
RocketJob::Job.completed.where(completed_at: {
|
51
|
+
RocketJob::Job.completed.where(completed_at: {"$lte" => completed_retention.seconds.ago}).destroy_all
|
52
52
|
end
|
53
|
-
RocketJob::Job.failed.where(completed_at: {
|
54
|
-
RocketJob::Job.paused.where(completed_at: {
|
55
|
-
RocketJob::Job.queued.where(created_at: {
|
53
|
+
RocketJob::Job.failed.where(completed_at: {"$lte" => failed_retention.seconds.ago}).destroy_all if failed_retention
|
54
|
+
RocketJob::Job.paused.where(completed_at: {"$lte" => paused_retention.seconds.ago}).destroy_all if paused_retention
|
55
|
+
RocketJob::Job.queued.where(created_at: {"$lte" => queued_retention.seconds.ago}).destroy_all if queued_retention
|
56
56
|
|
57
57
|
if destroy_zombies
|
58
58
|
# Cleanup zombie servers
|
@@ -32,8 +32,15 @@
|
|
32
32
|
# job.cleanup!
|
33
33
|
#
|
34
34
|
# By default output is not collected, add the option `collect_output: true` to collect output.
|
35
|
+
#
|
35
36
|
# Example:
|
36
|
-
# job = RocketJob::Jobs::OnDemandBatchJob(
|
37
|
+
# job = RocketJob::Jobs::OnDemandBatchJob(
|
38
|
+
# description: 'Fix data',
|
39
|
+
# code: code,
|
40
|
+
# throttle_running_workers: 5,
|
41
|
+
# priority: 30,
|
42
|
+
# collect_output: true
|
43
|
+
# )
|
37
44
|
#
|
38
45
|
# Example: Move the upload operation into a before_batch.
|
39
46
|
# upload_code = <<-CODE
|
@@ -61,7 +68,7 @@ module RocketJob
|
|
61
68
|
include RocketJob::Batch::Statistics
|
62
69
|
|
63
70
|
self.priority = 90
|
64
|
-
self.description =
|
71
|
+
self.description = "Batch Job"
|
65
72
|
self.destroy_on_complete = false
|
66
73
|
|
67
74
|
# Code that is performed against every row / record.
|
@@ -104,23 +111,26 @@ module RocketJob
|
|
104
111
|
|
105
112
|
def validate_code
|
106
113
|
return if code.nil?
|
114
|
+
|
107
115
|
validate_field(:code) { load_perform_code }
|
108
116
|
end
|
109
117
|
|
110
118
|
def validate_before_code
|
111
119
|
return if before_code.nil?
|
120
|
+
|
112
121
|
validate_field(:before_code) { instance_eval("def __before_code\n#{before_code}\nend") }
|
113
122
|
end
|
114
123
|
|
115
124
|
def validate_after_code
|
116
125
|
return if after_code.nil?
|
126
|
+
|
117
127
|
validate_field(:after_code) { instance_eval("def __after_code\n#{after_code}\nend") }
|
118
128
|
end
|
119
129
|
|
120
130
|
def validate_field(field)
|
121
131
|
yield
|
122
|
-
rescue Exception =>
|
123
|
-
errors.add(field, "Failed to load :#{field}, #{
|
132
|
+
rescue Exception => e
|
133
|
+
errors.add(field, "Failed to load :#{field}, #{e.inspect}")
|
124
134
|
end
|
125
135
|
end
|
126
136
|
end
|
@@ -74,7 +74,7 @@ module RocketJob
|
|
74
74
|
include RocketJob::Plugins::Cron
|
75
75
|
include RocketJob::Plugins::Retry
|
76
76
|
|
77
|
-
self.description =
|
77
|
+
self.description = "On Demand Job"
|
78
78
|
self.destroy_on_complete = false
|
79
79
|
self.retry_limit = 0
|
80
80
|
|
@@ -95,8 +95,8 @@ module RocketJob
|
|
95
95
|
|
96
96
|
def validate_code
|
97
97
|
load_code
|
98
|
-
rescue Exception =>
|
99
|
-
errors.add(:code, "Failed to parse :code, #{
|
98
|
+
rescue Exception => e
|
99
|
+
errors.add(:code, "Failed to parse :code, #{e.inspect}")
|
100
100
|
end
|
101
101
|
end
|
102
102
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
begin
|
2
|
-
require
|
2
|
+
require "active_record"
|
3
3
|
rescue LoadError
|
4
4
|
raise 'RocketJob::Jobs::ReEncrypt::RelationalJob uses ActiveRecord to obtain the database connection, please install the gem "activerecord".'
|
5
5
|
end
|
@@ -20,12 +20,12 @@ module RocketJob
|
|
20
20
|
class RelationalJob < RocketJob::Job
|
21
21
|
include RocketJob::Batch
|
22
22
|
|
23
|
-
self.slice_size
|
24
|
-
self.priority
|
25
|
-
self.destroy_on_complete
|
26
|
-
self.compress
|
27
|
-
self.throttle_running_jobs
|
28
|
-
self.
|
23
|
+
self.slice_size = 1000
|
24
|
+
self.priority = 30
|
25
|
+
self.destroy_on_complete = false
|
26
|
+
self.compress = true
|
27
|
+
self.throttle_running_jobs = 1
|
28
|
+
self.throttle_running_workers = 10
|
29
29
|
|
30
30
|
# Name of the table being re-encrypted
|
31
31
|
field :table_name, type: String
|
@@ -43,7 +43,7 @@ module RocketJob
|
|
43
43
|
connection.tables.each do |table|
|
44
44
|
columns = connection.columns(table)
|
45
45
|
columns.each do |column|
|
46
|
-
if column.name.start_with?(
|
46
|
+
if column.name.start_with?("encrypted_")
|
47
47
|
add_column = column.name
|
48
48
|
(h[table] ||= []) << add_column if add_column
|
49
49
|
end
|
@@ -90,7 +90,7 @@ module RocketJob
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
if updates.size.positive?
|
93
|
-
sql << updates.join(
|
93
|
+
sql << updates.join(", ")
|
94
94
|
sql << " where id=#{row[1]}"
|
95
95
|
logger.trace sql
|
96
96
|
self.class.connection.execute sql
|
@@ -114,7 +114,8 @@ module RocketJob
|
|
114
114
|
end
|
115
115
|
|
116
116
|
def re_encrypt(encrypted_value)
|
117
|
-
return encrypted_value if (encrypted_value ==
|
117
|
+
return encrypted_value if (encrypted_value == "") || encrypted_value.nil?
|
118
|
+
|
118
119
|
SymmetricEncryption.encrypt(SymmetricEncryption.decrypt(encrypted_value))
|
119
120
|
end
|
120
121
|
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "fileutils"
|
2
|
+
require "uri"
|
3
3
|
|
4
4
|
module RocketJob
|
5
5
|
module Jobs
|
@@ -40,10 +40,10 @@ module RocketJob
|
|
40
40
|
job.id = job_id if job_id
|
41
41
|
upload_file(job)
|
42
42
|
job.save!
|
43
|
-
rescue StandardError =>
|
43
|
+
rescue StandardError => e
|
44
44
|
# Prevent partial uploads
|
45
45
|
job&.cleanup! if job.respond_to?(:cleanup!)
|
46
|
-
raise(
|
46
|
+
raise(e)
|
47
47
|
end
|
48
48
|
|
49
49
|
private
|
@@ -74,6 +74,7 @@ module RocketJob
|
|
74
74
|
def job_is_a_rocket_job
|
75
75
|
klass = job_class
|
76
76
|
return if klass.nil? || klass.ancestors&.include?(RocketJob::Job)
|
77
|
+
|
77
78
|
errors.add(:job_class_name, "Model #{job_class_name} must be defined and inherit from RocketJob::Job")
|
78
79
|
end
|
79
80
|
|
@@ -83,14 +84,17 @@ module RocketJob
|
|
83
84
|
def job_implements_upload
|
84
85
|
klass = job_class
|
85
86
|
return if klass.nil? || klass.instance_methods.any? { |m| VALID_INSTANCE_METHODS.include?(m) }
|
87
|
+
|
86
88
|
errors.add(:job_class_name, "#{job_class} must implement any one of: :#{VALID_INSTANCE_METHODS.join(' :')} instance methods")
|
87
89
|
end
|
88
90
|
|
89
91
|
def file_exists
|
90
92
|
return if upload_file_name.nil?
|
93
|
+
|
91
94
|
uri = URI.parse(upload_file_name)
|
92
|
-
return unless uri.scheme.nil? || uri.scheme ==
|
95
|
+
return unless uri.scheme.nil? || uri.scheme == "file"
|
93
96
|
return if File.exist?(upload_file_name)
|
97
|
+
|
94
98
|
errors.add(:upload_file_name, "Upload file: #{upload_file_name} does not exist.")
|
95
99
|
end
|
96
100
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "csv"
|
2
|
+
require "yaml"
|
3
|
+
require "optparse"
|
4
4
|
module RocketJob
|
5
5
|
class Performance
|
6
6
|
attr_accessor :count, :servers, :workers, :version, :ruby, :environment, :mongo_config
|
@@ -11,20 +11,20 @@ module RocketJob
|
|
11
11
|
@count = 100_000
|
12
12
|
@servers = 0
|
13
13
|
@workers = 0
|
14
|
-
@environment = ENV[
|
15
|
-
@mongo_config =
|
14
|
+
@environment = ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"
|
15
|
+
@mongo_config = "config/mongoid.yml"
|
16
16
|
end
|
17
17
|
|
18
18
|
# Loads the queue with jobs to be processed once the queue is loaded.
|
19
19
|
# Retain the first and last job for timings, all others are destroyed on completion.
|
20
20
|
def run_test_case(count = self.count)
|
21
21
|
if RocketJob::Server.where(:state.in => %w[running paused]).count.zero?
|
22
|
-
raise
|
22
|
+
raise "Please start servers before starting the performance test"
|
23
23
|
end
|
24
24
|
|
25
25
|
count_running_workers
|
26
26
|
|
27
|
-
puts
|
27
|
+
puts "Waiting for workers to pause"
|
28
28
|
RocketJob::Server.pause_all
|
29
29
|
RocketJob::Jobs::SimpleJob.delete_all
|
30
30
|
|
@@ -36,15 +36,16 @@ module RocketJob
|
|
36
36
|
end
|
37
37
|
puts "Waiting for #{running} workers"
|
38
38
|
break if running.zero?
|
39
|
+
|
39
40
|
sleep 1
|
40
41
|
end
|
41
42
|
|
42
|
-
puts
|
43
|
+
puts "Enqueuing jobs"
|
43
44
|
first = RocketJob::Jobs::SimpleJob.create!(priority: 1, destroy_on_complete: false)
|
44
45
|
(count - 2).times { RocketJob::Jobs::SimpleJob.create! }
|
45
46
|
last = RocketJob::Jobs::SimpleJob.create!(priority: 100, destroy_on_complete: false)
|
46
47
|
|
47
|
-
puts
|
48
|
+
puts "Resuming workers"
|
48
49
|
RocketJob::Server.resume_all
|
49
50
|
|
50
51
|
sleep 3 until last.reload.completed?
|
@@ -58,7 +59,7 @@ module RocketJob
|
|
58
59
|
|
59
60
|
# Export the Results hash to a CSV file
|
60
61
|
def export_results(results)
|
61
|
-
CSV.open("job_results_#{ruby}_#{servers}s_#{workers}w_v#{version}.csv",
|
62
|
+
CSV.open("job_results_#{ruby}_#{servers}s_#{workers}w_v#{version}.csv", "wb") do |csv|
|
62
63
|
csv << results.first.keys
|
63
64
|
results.each { |result| csv << result.values }
|
64
65
|
end
|
@@ -66,25 +67,25 @@ module RocketJob
|
|
66
67
|
|
67
68
|
# Parse command line options
|
68
69
|
def parse(argv)
|
69
|
-
parser
|
70
|
-
o.on(
|
71
|
-
|
72
|
-
|
70
|
+
parser = OptionParser.new do |o|
|
71
|
+
o.on("-c",
|
72
|
+
"--count COUNT",
|
73
|
+
"Count of jobs to enqueue") do |arg|
|
73
74
|
self.count = arg.to_i
|
74
75
|
end
|
75
|
-
o.on(
|
76
|
-
|
77
|
-
|
76
|
+
o.on("-m",
|
77
|
+
"--mongo MONGO_CONFIG_FILE_NAME",
|
78
|
+
"Path and filename of config file. Default: config/mongoid.yml") do |arg|
|
78
79
|
self.mongo_config = arg
|
79
80
|
end
|
80
|
-
o.on(
|
81
|
-
|
82
|
-
|
81
|
+
o.on("-e",
|
82
|
+
"--environment ENVIRONMENT",
|
83
|
+
"The environment to run the app on (Default: RAILS_ENV || RACK_ENV || development)") do |arg|
|
83
84
|
self.environment = arg
|
84
85
|
end
|
85
86
|
end
|
86
|
-
parser.banner =
|
87
|
-
parser.on_tail
|
87
|
+
parser.banner = "rocketjob_perf <options>"
|
88
|
+
parser.on_tail "-h", "--help", "Show help" do
|
88
89
|
puts parser
|
89
90
|
exit 1
|
90
91
|
end
|
@@ -96,6 +97,7 @@ module RocketJob
|
|
96
97
|
self.workers = 0
|
97
98
|
RocketJob::Server.running.each do |server|
|
98
99
|
next if server.zombie?
|
100
|
+
|
99
101
|
self.servers += 1
|
100
102
|
self.workers += server.heartbeat.workers
|
101
103
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "active_support/concern"
|
2
2
|
|
3
3
|
module RocketJob
|
4
4
|
module Plugins
|
@@ -26,6 +26,7 @@ module RocketJob
|
|
26
26
|
# Overrides: RocketJob::Plugins::Restart#rocket_job_restart_new_instance
|
27
27
|
def rocket_job_restart_new_instance
|
28
28
|
return unless cron_schedule
|
29
|
+
|
29
30
|
super
|
30
31
|
end
|
31
32
|
|
@@ -35,6 +36,7 @@ module RocketJob
|
|
35
36
|
# Overrides: RocketJob::Plugins::Restart#rocket_job_restart_abort
|
36
37
|
def rocket_job_restart_abort
|
37
38
|
return unless cron_schedule
|
39
|
+
|
38
40
|
rocket_job_restart_new_instance
|
39
41
|
update_attribute(:cron_schedule, nil)
|
40
42
|
end
|
@@ -54,14 +56,16 @@ module RocketJob
|
|
54
56
|
|
55
57
|
def rocket_job_cron_set_run_at
|
56
58
|
return unless cron_schedule
|
59
|
+
|
57
60
|
self.run_at = rocket_job_cron_next_time if cron_schedule_changed? && !run_at_changed?
|
58
61
|
end
|
59
62
|
|
60
63
|
def rocket_job_cron_valid
|
61
64
|
return unless cron_schedule
|
65
|
+
|
62
66
|
RocketJob::Plugins::Rufus::CronLine.new(cron_schedule)
|
63
|
-
rescue ArgumentError =>
|
64
|
-
errors.add(:cron_schedule,
|
67
|
+
rescue ArgumentError => e
|
68
|
+
errors.add(:cron_schedule, e.message)
|
65
69
|
end
|
66
70
|
end
|
67
71
|
end
|