From e430e3935548b61ca553023cad04c624c63066df Mon Sep 17 00:00:00 2001 From: Graham Marlow Date: Thu, 9 Nov 2023 09:04:20 -0800 Subject: [PATCH] Add sidekiq_option for on-conflict-reschedule perform_in time (#813) Add schedule_in sidekiq job option to customize the on-conflict-reschedule duration of 5 seconds. The default remains 5 seconds if no schedule_in is provided. --- lib/sidekiq_unique_jobs/on_conflict/reschedule.rb | 6 +++++- .../on_conflict/reschedule_spec.rb | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/sidekiq_unique_jobs/on_conflict/reschedule.rb b/lib/sidekiq_unique_jobs/on_conflict/reschedule.rb index 454b80aa1..45f569c28 100644 --- a/lib/sidekiq_unique_jobs/on_conflict/reschedule.rb +++ b/lib/sidekiq_unique_jobs/on_conflict/reschedule.rb @@ -21,7 +21,7 @@ def initialize(item, redis_pool = nil) # This will mess up sidekiq stats because a new job is created def call if sidekiq_job_class? - if job_class.set(queue: item["queue"].to_sym).perform_in(5, *item[ARGS]) + if job_class.set(queue: item["queue"].to_sym).perform_in(schedule_in, *item[ARGS]) reflect(:rescheduled, item) else reflect(:reschedule_failed, item) @@ -30,6 +30,10 @@ def call reflect(:unknown_sidekiq_worker, item) end end + + def schedule_in + job_class.get_sidekiq_options["schedule_in"] || 5 + end end end end diff --git a/spec/sidekiq_unique_jobs/on_conflict/reschedule_spec.rb b/spec/sidekiq_unique_jobs/on_conflict/reschedule_spec.rb index da91fe652..f352ef2b4 100644 --- a/spec/sidekiq_unique_jobs/on_conflict/reschedule_spec.rb +++ b/spec/sidekiq_unique_jobs/on_conflict/reschedule_spec.rb @@ -26,6 +26,21 @@ allow(UniqueJobOnConflictReschedule).to receive(:perform_in).and_call_original end + context "when schedule_in is set to ten seconds" do + around do |block| + UniqueJobOnConflictReschedule.use_options(schedule_in: 10) do + block.call + end + end + + it "schedules a job ten seconds from now" do + expect { call }.to change { schedule_count }.by(1) + + expect(UniqueJobOnConflictReschedule).to have_received(:perform_in) + .with(10, *item["args"]) + end + end + it "schedules a job five seconds from now" do expect { call }.to change { schedule_count }.by(1)