diff --git a/lib/sidekiq/worker.rb b/lib/sidekiq/worker.rb index 18b2ecb7..df8d6c51 100644 --- a/lib/sidekiq/worker.rb +++ b/lib/sidekiq/worker.rb @@ -64,13 +64,13 @@ module Sidekiq # numeric (like an activesupport time interval). def perform_in(interval, *args) int = interval.to_f - now = Time.now - ts = (int < 1_000_000_000 ? (now + interval).to_f : int) + now = Time.now.to_f + ts = (int < 1_000_000_000 ? now + int : int) item = { 'class' => self, 'args' => args, 'at' => ts } # Optimization to enqueue something now that is scheduled to go out now or in the past - item.delete('at'.freeze) if ts <= now.to_f + item.delete('at'.freeze) if ts <= now client_push(item) end diff --git a/test/test_scheduling.rb b/test/test_scheduling.rb index 0d3e4dc6..f429471b 100644 --- a/test/test_scheduling.rb +++ b/test/test_scheduling.rb @@ -11,6 +11,11 @@ class TestScheduling < Sidekiq::Test end end + # Assume we can pass any class as time to perform_in + class TimeDuck + def to_f; 42.0 end + end + it 'schedules jobs' do ss = Sidekiq::ScheduledSet.new ss.clear @@ -34,6 +39,9 @@ class TestScheduling < Sidekiq::Test assert Sidekiq::Client.push_bulk('class' => ScheduledWorker, 'args' => [['mike'], ['mike']], 'at' => 600) assert_equal 5, ss.size + + assert ScheduledWorker.perform_in(TimeDuck.new, 'samwise') + assert_equal 6, ss.size end it 'removes the enqueued_at field when scheduling' do