rocketjob 5.1.1 → 5.2.0.beta1
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.
- 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
|