38 lines
872 B
Ruby
38 lines
872 B
Ruby
|
|
class ReadingsJob < RedisSetJob
|
||
|
|
queue_as :readings
|
||
|
|
|
||
|
|
def self.base_key
|
||
|
|
"Reading:new"
|
||
|
|
end
|
||
|
|
|
||
|
|
def self.job_size
|
||
|
|
ArchiveConfig.READING_JOB_SIZE
|
||
|
|
end
|
||
|
|
|
||
|
|
def self.batch_size
|
||
|
|
ArchiveConfig.READING_BATCH_SIZE
|
||
|
|
end
|
||
|
|
|
||
|
|
def perform_on_batch(batch)
|
||
|
|
# Each item in the batch is an array of arguments encoded as a JSON:
|
||
|
|
parsed_batch = batch.map do |json|
|
||
|
|
ActiveSupport::JSON.decode(json)
|
||
|
|
end
|
||
|
|
|
||
|
|
# Sort to try to reduce deadlocks.
|
||
|
|
#
|
||
|
|
# The first argument is user_id, the third argument is work_id:
|
||
|
|
sorted_batch = parsed_batch.sort_by do |args|
|
||
|
|
[args.first.to_i, args.third.to_i]
|
||
|
|
end
|
||
|
|
|
||
|
|
# Finally, start a transaction and call Reading.reading_object to write the
|
||
|
|
# information to the database:
|
||
|
|
Reading.transaction do
|
||
|
|
sorted_batch.each do |args|
|
||
|
|
Reading.reading_object(*args)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|