rocketjob 6.0.0 → 6.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e313f192b854d066258a614ceac1131851c8df94c7e08f7cea6681fff6946d69
4
- data.tar.gz: 10804682bee08715671696db4610ce4f93679398398bc385e93619f5a3aca715
3
+ metadata.gz: fc1f3d316be0aa058cee5b22c116872a80ea5bdaf7d72db447ae13781ba6b370
4
+ data.tar.gz: 87f56a455792e45ab2ad706f0c8bd625590df9942806bbd308c5145d07e94973
5
5
  SHA512:
6
- metadata.gz: 158675e5ddec87a8b277708887b037746e3f1573569edd5a8959eabdf5668b144553cbe6164844f2cf69bc603798b3b5b052697506dad8a29e8477afc62cc45f
7
- data.tar.gz: 680efe5603de3649b7e09340a545d2e1df1e02697d34af9451869310e9f2a87bbd05423686bb7d40d60f104553f7311721870e52ac2171bb1491b3a8decaf439
6
+ metadata.gz: f928a3afb886c39893ef5b5d2e13f71405c83df53c3b02826e474326c9171f87c84e595fc179a0e22cbc69d846f1da12eb268026fc06bcaf609920326159c6f4
7
+ data.tar.gz: 3b90508c45e7a09739ae53e5bb66992d80251a5b5668eb568eeba30a8da8d109bbb162b2db66e93f82ce3deb4f6cc9425175d0f9c41adb351f6c3885768db3dc
@@ -75,27 +75,26 @@ module RocketJob
75
75
  return category_name if category_name.is_a?(Category::Input)
76
76
  raise(ArgumentError, "Cannot supply Output Category to input category") if category_name.is_a?(Category::Output)
77
77
 
78
+ # Initialize categories when this method is called before initialization is complete
79
+ rocketjob_categories_assign if input_categories.empty?
80
+
78
81
  category_name = category_name.to_sym
79
82
  # find does not work against this association
80
83
  input_categories.each { |category| return category if category.name == category_name }
81
84
 
82
- unless category_name == :main
83
- raise(
84
- ArgumentError,
85
- "Unknown Input Category: #{category_name.inspect}. Registered categories: #{input_categories.collect(&:name).join(',')}"
86
- )
87
- end
88
-
89
- # Auto-register main input category when not defined
90
- category = Category::Input.new(job: self)
91
- self.input_categories << category
92
- category
85
+ raise(
86
+ ArgumentError,
87
+ "Unknown Input Category: #{category_name.inspect}. Registered categories: #{input_categories.collect(&:name).join(',')}"
88
+ )
93
89
  end
94
90
 
95
91
  def output_category(category_name = :main)
96
92
  return category_name if category_name.is_a?(Category::Output)
97
93
  raise(ArgumentError, "Cannot supply Input Category to output category") if category_name.is_a?(Category::Input)
98
94
 
95
+ # Initialize categories when this method is called before initialization is complete
96
+ rocketjob_categories_assign if output_categories.empty? && self.class.defined_output_categories
97
+
99
98
  category_name = category_name.to_sym
100
99
  # .find does not work against this association
101
100
  output_categories.each { |category| return category if category.name == category_name }
@@ -154,7 +153,7 @@ module RocketJob
154
153
  end
155
154
  end
156
155
 
157
- return if !self.class.defined_output_categories || !output_categories.empty?
156
+ return if !output_categories.empty? || !self.class.defined_output_categories
158
157
 
159
158
  # Input categories defaults to nil if none was set in the class
160
159
  self.output_categories = self.class.defined_output_categories.deep_dup
@@ -164,7 +163,6 @@ module RocketJob
164
163
  def rocketjob_categories_output_render
165
164
  return if @rocket_job_output.nil?
166
165
 
167
- # TODO: ..
168
166
  return unless output_categories
169
167
  return if output_categories.empty?
170
168
 
@@ -71,6 +71,7 @@ module RocketJob
71
71
  validates_presence_of :pattern, :job_class_name, :archive_directory
72
72
  validate :job_is_a_rocket_job
73
73
  validate :job_has_properties
74
+ validates_uniqueness_of :pattern, :name
74
75
 
75
76
  # State Machine events and transitions
76
77
  #
@@ -97,6 +98,7 @@ module RocketJob
97
98
  event :enable do
98
99
  transitions from: :pending, to: :enabled
99
100
  transitions from: :disabled, to: :enabled
101
+ transitions from: :failed, to: :enabled
100
102
  end
101
103
 
102
104
  event :disable do
@@ -23,7 +23,7 @@ module RocketJob
23
23
  new(
24
24
  args.merge(
25
25
  class_name: exc.class.name,
26
- message: exc.message,
26
+ message: exc.message.to_s.encode("UTF-8", replace: ""),
27
27
  backtrace: exc.backtrace || []
28
28
  )
29
29
  )
@@ -59,23 +59,31 @@ module RocketJob
59
59
  def check_directories
60
60
  new_file_names = {}
61
61
  DirmonEntry.enabled.each do |dirmon_entry|
62
- dirmon_entry.each do |path|
63
- # Skip file size checking since S3 files are only visible once completely uploaded.
64
- unless path.partial_files_visible?
65
- logger.info("File: #{path}. Starting: #{dirmon_entry.job_class_name}")
66
- dirmon_entry.later(path)
67
- next
68
- end
62
+ check_entry(dirmon_entry, new_file_names)
63
+ end
64
+ self.previous_file_names = new_file_names
65
+ end
69
66
 
70
- # BSON Keys cannot contain periods
71
- key = path.to_s.tr(".", "_")
72
- previous_size = previous_file_names[key]
73
- # Check every few minutes for a file size change before trying to process the file.
74
- size = check_file(dirmon_entry, path, previous_size)
75
- new_file_names[key] = size if size
67
+ def check_entry(dirmon_entry, file_names)
68
+ dirmon_entry.each do |path|
69
+ # Skip file size checking since S3 files are only visible once completely uploaded.
70
+ unless path.partial_files_visible?
71
+ logger.info("File: #{path}. Starting: #{dirmon_entry.job_class_name}")
72
+ dirmon_entry.later(path)
73
+ next
76
74
  end
75
+
76
+ # BSON Keys cannot contain periods
77
+ key = path.to_s.tr(".", "_")
78
+ previous_size = previous_file_names[key]
79
+ # Check every few minutes for a file size change before trying to process the file.
80
+ size = check_file(dirmon_entry, path, previous_size)
81
+ file_names[key] = size if size
77
82
  end
78
- self.previous_file_names = new_file_names
83
+ rescue StandardError => e
84
+ logger.error("Dirmon Entry: #{dirmon_entry.id} failed. Moved to `failed` state to prevent processing again without manual intervention.", e)
85
+ dirmon_entry.fail(worker_name, e)
86
+ dirmon_entry.save(validate: false)
79
87
  end
80
88
 
81
89
  # Checks if a file should result in starting a job
@@ -145,6 +145,10 @@ module RocketJob
145
145
  rescue Exception => e
146
146
  errors.add(field, "Failed to load :#{field}, #{e.inspect}")
147
147
  end
148
+
149
+ # Allow multiple instances of this job to run with the same cron schedule
150
+ def rocket_job_cron_singleton_check
151
+ end
148
152
  end
149
153
  end
150
154
  end
@@ -97,6 +97,10 @@ module RocketJob
97
97
  rescue Exception => e
98
98
  errors.add(:code, "Failed to parse :code, #{e.inspect}")
99
99
  end
100
+
101
+ # Allow multiple instances of this job to run with the same cron schedule
102
+ def rocket_job_cron_singleton_check
103
+ end
100
104
  end
101
105
  end
102
106
  end
@@ -13,14 +13,20 @@ module RocketJob
13
13
  included do
14
14
  field :dependent_jobs, type: Array, class_attribute: true, user_editable: true, copy_on_restart: true
15
15
 
16
- define_throttle :dependent_job_exists?
17
- define_batch_throttle :dependent_job_exists? if respond_to?(:define_batch_throttle)
16
+ define_throttle :dependent_jobs_running?
17
+ define_batch_throttle :dependent_jobs_running? if respond_to?(:define_batch_throttle)
18
+ end
19
+
20
+ class_methods do
21
+ def depends_on_job(*jobs)
22
+ self.dependent_jobs = Array(jobs).collect(&:to_s)
23
+ end
18
24
  end
19
25
 
20
26
  private
21
27
 
22
28
  # Checks if there are any dependent jobs are running
23
- def dependent_job_exists?
29
+ def dependent_jobs_running?
24
30
  return false if dependent_jobs.blank?
25
31
 
26
32
  jobs_count = RocketJob::Job.running.where(:_type.in => dependent_jobs).count
@@ -0,0 +1,17 @@
1
+ module RocketJob
2
+ module Subscribers
3
+ # Cause all instances to refresh their in-memory copy
4
+ # of the Secret Config Registry
5
+ #
6
+ # RocketJob::Subscribers::SecretConfig.publish(:refresh)
7
+ class SecretConfig
8
+ include RocketJob::Subscriber
9
+
10
+ def refresh
11
+ logger.measure_info "Refreshed Secret Config" do
12
+ ::SecretConfig.refresh!
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -34,6 +34,7 @@ module RocketJob
34
34
  logger.info "Rocket Job Server started"
35
35
 
36
36
  event_listener = Thread.new { Event.listener }
37
+ Subscribers::SecretConfig.subscribe if defined?(SecretConfig)
37
38
  Subscribers::Server.subscribe(self) do
38
39
  Subscribers::Worker.subscribe(self) do
39
40
  Subscribers::Logger.subscribe do
@@ -1,3 +1,3 @@
1
1
  module RocketJob
2
- VERSION = "6.0.0".freeze
2
+ VERSION = "6.1.0".freeze
3
3
  end
data/lib/rocketjob.rb CHANGED
@@ -83,12 +83,13 @@ module RocketJob
83
83
  autoload :UploadFileJob, "rocket_job/jobs/upload_file_job"
84
84
 
85
85
  module ReEncrypt
86
- autoload :RelationalJob, "rocket_job/jobs/re_encrypt/relational_job"
86
+ autoload :RelationalJob, "rocket_job/jobs/re_encrypt/relational_job"
87
87
  end
88
88
  end
89
89
 
90
90
  module Subscribers
91
91
  autoload :Logger, "rocket_job/subscribers/logger"
92
+ autoload :SecretConfig, "rocket_job/subscribers/secret_config"
92
93
  autoload :Server, "rocket_job/subscribers/server"
93
94
  autoload :Worker, "rocket_job/subscribers/worker"
94
95
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rocketjob
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0
4
+ version: 6.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-25 00:00:00.000000000 Z
11
+ date: 2021-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aasm
@@ -84,14 +84,14 @@ dependencies:
84
84
  name: semantic_logger
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '4.7'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '4.7'
97
97
  - !ruby/object:Gem::Dependency
@@ -205,6 +205,7 @@ files:
205
205
  - lib/rocket_job/sliced/writer/output.rb
206
206
  - lib/rocket_job/subscriber.rb
207
207
  - lib/rocket_job/subscribers/logger.rb
208
+ - lib/rocket_job/subscribers/secret_config.rb
208
209
  - lib/rocket_job/subscribers/server.rb
209
210
  - lib/rocket_job/subscribers/worker.rb
210
211
  - lib/rocket_job/supervisor.rb