rocketjob 5.2.0.beta2 → 5.2.0.beta3
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0cece68774d1d549fb219daa5f78f3def0e5b3c51d0659fea8812da200b6b268
|
4
|
+
data.tar.gz: 69ca23691dcbe2c8ba1b7b5a60a4d18cb8b033cf37510c2a0f1f0a02075357a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff6d1c42eca584b91dbf27312b962ed4615168616a77531d70ca9a252145aac47f1c0a08655433aa956b143bab6a517e0b973b63474ba25cb718eb018df3950d
|
7
|
+
data.tar.gz: 9add07cf69e3bf6cfc0d1aa62902ce00deb07ba41f922491afbe531e00b364fddee70f99f86497b7ec45e97637e715d355e55a6c30dbebcde2a8811b907e4d03
|
@@ -63,7 +63,7 @@ module RocketJob
|
|
63
63
|
|
64
64
|
# Cannot use this class since it will include instances of parent job classes.
|
65
65
|
RocketJob::Job.with(read: {mode: :primary}) do |conn|
|
66
|
-
conn.running.where("_type" => self.class.name, :id.ne => id, :priority.
|
66
|
+
conn.running.where("_type" => self.class.name, :id.ne => id, :priority.lte => priority).count >= throttle_running_jobs
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
@@ -130,45 +130,56 @@ module RocketJob
|
|
130
130
|
# Once the slice has been successfully processed it will be removed from the input collection
|
131
131
|
# Returns [Integer] the number of records successfully processed
|
132
132
|
def rocket_job_process_slice(slice, &block)
|
133
|
-
|
134
|
-
|
135
|
-
@rocket_job_slice = slice
|
133
|
+
@rocket_job_slice = slice
|
134
|
+
count = 0
|
136
135
|
|
137
|
-
processed_records = 0
|
138
136
|
run_callbacks(:slice) do
|
139
137
|
# Allow before_slice callbacks to fail, complete or abort this slice.
|
140
138
|
return 0 unless running?
|
141
139
|
|
142
|
-
|
143
|
-
slice.each do |record|
|
144
|
-
SemanticLogger.named_tagged(record: @rocket_job_record_number) do
|
145
|
-
writer << rocket_job_batch_perform(slice, record, &block)
|
146
|
-
processed_records += 1
|
147
|
-
end
|
148
|
-
# JRuby thinks self.rocket_job_record_number= is private and cannot be accessed
|
149
|
-
@rocket_job_record_number += 1
|
150
|
-
end
|
151
|
-
end
|
152
|
-
@rocket_job_slice = nil
|
153
|
-
@rocket_job_record_number = nil
|
140
|
+
count = rocket_job_perform_slice(slice, &block)
|
154
141
|
end
|
142
|
+
@rocket_job_slice = nil
|
155
143
|
|
156
144
|
# On successful completion remove the slice from the input queue
|
157
145
|
# TODO: Add option to complete slice instead of destroying it to retain input data.
|
158
146
|
slice.destroy
|
159
|
-
|
147
|
+
count
|
148
|
+
end
|
149
|
+
|
150
|
+
# Perform individual slice without callbacks
|
151
|
+
def rocket_job_perform_slice(slice, &block)
|
152
|
+
count = 0
|
153
|
+
RocketJob::Sliced::Writer::Output.collect(self, slice) do |writer|
|
154
|
+
records = slice.records
|
155
|
+
slice.processing_record_number ||= 0
|
156
|
+
|
157
|
+
# Skip records already processed, if any.
|
158
|
+
# TODO: Must append to existing output slices before this can be enabled.
|
159
|
+
# if !collect_output && (slice.processing_record_number > 1)
|
160
|
+
# records = records[slice.processing_record_number - 1..-1]
|
161
|
+
# end
|
162
|
+
|
163
|
+
records.each do |record|
|
164
|
+
slice.processing_record_number += 1
|
165
|
+
SemanticLogger.named_tagged(record: slice.current_record_number) do
|
166
|
+
writer << rocket_job_batch_perform(slice, record, &block)
|
167
|
+
count += 1
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
count
|
160
172
|
end
|
161
173
|
|
162
174
|
# Perform a single record within the current slice.
|
163
175
|
def rocket_job_batch_perform(slice, record)
|
164
|
-
slice.
|
165
|
-
slice.processing_record_number += 1
|
176
|
+
@rocket_job_record_number = slice.current_record_number
|
166
177
|
|
167
178
|
return block_given? ? yield(record) : perform(record) if _perform_callbacks.empty?
|
168
179
|
|
169
180
|
# @rocket_job_input and @rocket_job_output can be modified by before/around callbacks
|
170
|
-
@rocket_job_input
|
171
|
-
@rocket_job_output
|
181
|
+
@rocket_job_input = record
|
182
|
+
@rocket_job_output = nil
|
172
183
|
|
173
184
|
run_callbacks(:perform) do
|
174
185
|
@rocket_job_output =
|
@@ -179,9 +190,9 @@ module RocketJob
|
|
179
190
|
end
|
180
191
|
end
|
181
192
|
|
182
|
-
@rocket_job_input
|
183
|
-
result
|
184
|
-
@rocket_job_output
|
193
|
+
@rocket_job_input = nil
|
194
|
+
result = @rocket_job_output
|
195
|
+
@rocket_job_output = nil
|
185
196
|
result
|
186
197
|
end
|
187
198
|
|
@@ -197,24 +208,7 @@ module RocketJob
|
|
197
208
|
if failed_count.positive? && (input_count == failed_count)
|
198
209
|
# Reload to pull in any counters or other data that was modified.
|
199
210
|
reload unless new_record?
|
200
|
-
if may_fail?
|
201
|
-
fail_job = true
|
202
|
-
unless new_record?
|
203
|
-
# Fail job iff no other worker has already finished it
|
204
|
-
# Must set write concern to at least 1 since we need the nModified back
|
205
|
-
result = self.class.with(write: {w: 1}) do |query|
|
206
|
-
query.
|
207
|
-
where(id: id, state: :running, sub_state: :processing).
|
208
|
-
update({"$set" => {state: :failed, worker_name: worker_name}})
|
209
|
-
end
|
210
|
-
fail_job = false unless result.modified_count.positive?
|
211
|
-
end
|
212
|
-
if fail_job
|
213
|
-
message = "#{failed_count} slices failed to process"
|
214
|
-
self.exception = JobException.new(message: message)
|
215
|
-
fail!(worker_name, message)
|
216
|
-
end
|
217
|
-
end
|
211
|
+
rocket_job_batch_fail!(worker_name) if may_fail?
|
218
212
|
return true
|
219
213
|
end
|
220
214
|
|
@@ -237,15 +231,38 @@ module RocketJob
|
|
237
231
|
|
238
232
|
# Reload to pull in any counters or other data that was modified.
|
239
233
|
reload
|
234
|
+
|
240
235
|
if result.modified_count.positive?
|
241
236
|
rocket_job_batch_run_after_callbacks(false)
|
242
|
-
|
237
|
+
elsif aborted?
|
243
238
|
# Repeat cleanup in case this worker was still running when the job was aborted
|
244
|
-
cleanup!
|
239
|
+
cleanup!
|
245
240
|
end
|
246
241
|
true
|
247
242
|
end
|
248
243
|
|
244
|
+
# Fail the job
|
245
|
+
def rocket_job_batch_fail!(worker_name)
|
246
|
+
fail_job = true
|
247
|
+
|
248
|
+
unless new_record?
|
249
|
+
# Fail job iff no other worker has already finished it
|
250
|
+
# Must set write concern to at least 1 since we need the nModified back
|
251
|
+
result = self.class.with(write: {w: 1}) do |query|
|
252
|
+
query.
|
253
|
+
where(id: id, state: :running, sub_state: :processing).
|
254
|
+
update({"$set" => {state: :failed, worker_name: worker_name}})
|
255
|
+
end
|
256
|
+
fail_job = false unless result.modified_count.positive?
|
257
|
+
end
|
258
|
+
|
259
|
+
return unless fail_job
|
260
|
+
|
261
|
+
message = "#{input.failed.count} slices failed to process"
|
262
|
+
self.exception = JobException.new(message: message)
|
263
|
+
new_record? ? fail(worker_name, message) : fail!(worker_name, message)
|
264
|
+
end
|
265
|
+
|
249
266
|
# Run the before_batch callbacks
|
250
267
|
# Saves the current state before and after running callbacks if callbacks present
|
251
268
|
def rocket_job_batch_run_before_callbacks
|
@@ -25,8 +25,8 @@ module RocketJob
|
|
25
25
|
|
26
26
|
# The record number of the first record in this slice.
|
27
27
|
# Useful in knowing the line number of each record in this slice
|
28
|
-
# relative to the original file that was uploaded.
|
29
|
-
field :first_record_number, type: Integer
|
28
|
+
# relative to the original file that was uploaded. (1-based index)
|
29
|
+
field :first_record_number, type: Integer, default: 1
|
30
30
|
|
31
31
|
#
|
32
32
|
# Read-only attributes
|
@@ -41,7 +41,7 @@ module RocketJob
|
|
41
41
|
# Number of times that this job has failed to process
|
42
42
|
field :failure_count, type: Integer
|
43
43
|
|
44
|
-
# Number of the record within this slice (not the entire file/job) currently being processed. (
|
44
|
+
# Number of the record within this slice (not the entire file/job) currently being processed. (1-based index)
|
45
45
|
field :processing_record_number, type: Integer
|
46
46
|
|
47
47
|
# This name of the worker that this job is being processed by, or was processed by
|
@@ -112,7 +112,7 @@ module RocketJob
|
|
112
112
|
|
113
113
|
# Returns [Integer] the record number of the record currently being processed relative to the entire file.
|
114
114
|
def current_record_number
|
115
|
-
first_record_number
|
115
|
+
first_record_number + (processing_record_number || 1) - 1
|
116
116
|
end
|
117
117
|
|
118
118
|
# Before Fail save the exception to this slice.
|
data/lib/rocket_job/version.rb
CHANGED
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: 5.2.0.
|
4
|
+
version: 5.2.0.beta3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Morrison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aasm
|