Sha256: 8040d9ea0fe68a15c1546954cc348c2e4f3b3ff61b6739f5dd40e859af8071f9
Contents?: true
Size: 1.1 KB
Versions: 1
Compression:
Stored size: 1.1 KB
Contents
module SyncMachine class EnsurePublication # Ensures that the current job is not: # 1. Currently being run by another worker # 2. Rendered unnecessary by the fact another job with the same subject was # completed since the time this job was requested. class Deduper def initialize(enqueue_time_str:, last_job_finished_at:, job_class:, subject_id:) @enqueue_time_str = enqueue_time_str @job_class = job_class @last_job_finished_at = last_job_finished_at @subject_id = subject_id end def dedupe lock = RedisLock.new("#{@job_class.name}:#{@subject_id}") lock.acquire do yield unless performed_since_enqueue_time? end lock.acquired? || reschedule_job end private def enqueue_time @enqueue_time ||= Time.parse(@enqueue_time_str) end def performed_since_enqueue_time? @last_job_finished_at && @last_job_finished_at > enqueue_time end def reschedule_job @job_class.perform_in(1 + rand(10), @subject_id, @enqueue_time_str) end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
sync_machine-1.4.0 | lib/sync_machine/ensure_publication/deduper.rb |