rocketjob 6.0.2 → 6.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 10ef66caa28110774987fdeff06af1a4906ed724bc307bf55d012e1104a9eca8
4
- data.tar.gz: b0384cccd5d694a3431c6c9cb7d004603c4b79865929b8c2bb249b4b66e937a2
3
+ metadata.gz: ca9a7af0f4448efdb418e738f95bc5f885d2399bdfd50ce3d0533c6928f3f78f
4
+ data.tar.gz: e0f1bc3fb3c60989f22ff4d75c1ed86c8f7a998bdc5bc02f0f8616dd9631029e
5
5
  SHA512:
6
- metadata.gz: 331a1c21ad9c2b481e67d5d3857e3158dd23a7bb6524dd872773e0aad0e0c5edb4e02d4a60be6498bc212e2517c81c027ce7f22d6b378e9d5772c391669c4347
7
- data.tar.gz: e46cdffa443cc75d5dbed5f396ec84fb19fd12bad5b48bbddad7d310526a941bd837f778da8391460e40c575caed62c6e0329adc99ae8c58b07ada694cb1684c
6
+ metadata.gz: 79e914a57bbdae9026cbe783d8a1743e538bb2b1ffebacb527561ef961174eaa24693e850e0b72ee9ae113611db96fe1e0e2edb85d6395cbc057b7fc17bf11e9
7
+ data.tar.gz: f6a8ba0b5060f54072a68fc396e43a3b9ba1c53b58e6b282006e111792e612d301b737279a344be252fc659724b70e12cff5400f49eb47316d38eda0571788f3
@@ -466,6 +466,8 @@ module RocketJob
466
466
  output_collection.download(header_line: binary_header_line) { |record| io.write(record) }
467
467
  end
468
468
  else
469
+ # TODO: Add category to named tags to aid problem determination
470
+ # And RJ Download metric with duration
469
471
  IOStreams.new(stream || category.file_name).writer(:line, **args) do |io|
470
472
  output_collection.download(header_line: header_line) { |record| io << record }
471
473
  end
@@ -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
@@ -6,22 +6,26 @@ module Mongo
6
6
  include SemanticLogger::Loggable
7
7
  logger.name = "Mongo"
8
8
 
9
+ undef :started
9
10
  def started(event)
10
11
  @event_command = event.command
11
12
  end
12
13
 
14
+ undef :succeeded
13
15
  def succeeded(event)
14
16
  logger.debug(message: prefix(event),
15
17
  duration: (event.duration * 1000),
16
18
  payload: @event_command)
17
19
  end
18
20
 
21
+ undef :failed
19
22
  def failed(event)
20
23
  logger.debug(message: "#{prefix(event)} Failed: #{event.message}",
21
24
  duration: (event.duration * 1000),
22
25
  payload: @event_command)
23
26
  end
24
27
 
28
+ undef :prefix
25
29
  def prefix(event)
26
30
  "#{event.address} | #{event.database_name}.#{event.command_name}"
27
31
  end
@@ -82,7 +82,10 @@ module RocketJob
82
82
  end
83
83
 
84
84
  def apply_streams(path, streams)
85
- streams.each_pair { |stream, args| path.stream(stream.to_sym, args.nil? ? {} : decode_args(args)) }
85
+ streams.each_pair do |stream, args|
86
+ stream_args = args.nil? ? {} : decode_args(args)
87
+ path.stream(stream.to_sym, **stream_args)
88
+ end
86
89
  end
87
90
 
88
91
  def decode_args(args)
@@ -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
@@ -12,6 +12,7 @@ module RocketJob
12
12
  # Call the supplied block for every record returned
13
13
  record_count = 0
14
14
  each do |slice|
15
+ # TODO: Add slice_id to named tags to aid problem determination
15
16
  slice.each do |record|
16
17
  record_count += 1
17
18
  yield(record)
@@ -14,7 +14,6 @@ module RocketJob
14
14
  Thread.current.name = "rocketjob main"
15
15
  RocketJob.create_indexes
16
16
  register_signal_handlers
17
- subscribe_to_events
18
17
 
19
18
  server = Server.create!
20
19
  new(server).run
@@ -35,8 +34,15 @@ module RocketJob
35
34
  logger.info "Rocket Job Server started"
36
35
 
37
36
  event_listener = Thread.new { Event.listener }
38
- supervise_pool
39
- stop!
37
+ Subscribers::SecretConfig.subscribe if defined?(SecretConfig)
38
+ Subscribers::Server.subscribe(self) do
39
+ Subscribers::Worker.subscribe(self) do
40
+ Subscribers::Logger.subscribe do
41
+ supervise_pool
42
+ stop!
43
+ end
44
+ end
45
+ end
40
46
  rescue ::Mongoid::Errors::DocumentNotFound
41
47
  logger.info("Server has been destroyed. Going down hard!")
42
48
  rescue Exception => e
@@ -89,12 +95,5 @@ module RocketJob
89
95
  def synchronize(&block)
90
96
  @mutex.synchronize(&block)
91
97
  end
92
-
93
- def subscribe_to_events
94
- Subscribers::Logger.subscribe
95
- Subscribers::SecretConfig.subscribe if defined?(SecretConfig)
96
- Subscribers::Server.subscribe
97
- Subscribers::Worker.subscribe
98
- end
99
98
  end
100
99
  end
@@ -1,3 +1,3 @@
1
1
  module RocketJob
2
- VERSION = "6.0.2".freeze
2
+ VERSION = "6.1.1".freeze
3
3
  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.2
4
+ version: 6.1.1
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-10-25 00:00:00.000000000 Z
11
+ date: 2022-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aasm
@@ -236,7 +236,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
236
236
  - !ruby/object:Gem::Version
237
237
  version: '0'
238
238
  requirements: []
239
- rubygems_version: 3.2.22
239
+ rubygems_version: 3.3.7
240
240
  signing_key:
241
241
  specification_version: 4
242
242
  summary: Ruby's missing batch processing system.