require'sidekiq-scheduler/worker'require'sidekiq/client'moduleSidekiqSchedulermoduleClient# Example usage:# Sidekiq::Client.delayed_push('my_queue', Time.now + 600, 'class' => MyWorker, 'args' => ['foo', 1, :bat => 'bar'])defdelayed_push(queue=nil,timestamp,item)raise(ArgumentError,"Message must be a Hash of the form: { 'class' => SomeClass, 'args' => ['bob', 1, :foo => 'bar'] }")unlessitem.is_a?(Hash)raise(ArgumentError,"Message must include a class and set of arguments: #{item.inspect}")if!item['class']||!item['args']timestamp=timestamp.to_iitem['queue']=queue.to_sifqueueitem['class']=item['class'].to_sif!item['class'].is_a?(String)# Add item to the list for this timestampSidekiq.redis{|r|r.rpush("delayed:#{timestamp}",MultiJson.encode(item))}# Add timestamp to zset. Score and value are based on the timestamp# as querying will be based on thatSidekiq.redis{|r|r.zadd('delayed_queue_schedule',timestamp,timestamp)}enddefremove_scheduler_queue(timestamp)key="delayed:#{timestamp}"if0==Sidekiq.redis{|r|r.llen(key)}Sidekiq.redis{|r|r.del(key)}Sidekiq.redis{|r|r.zrem('delayed_queue_schedule',timestamp)}endend# Example usage:# Sidekiq::Client.remove_all_delayed(MyWorker, 'foo', 1, :bat => 'bar')## Returns the number of jobs removed## This method can be very expensive since it needs to scan# through the delayed queues of all timestampsdefremove_all_delayed(klass,*args)remove_all_delayed_from_queue(nil,klass,*args)end# Example usage:# Sidekiq::Client.remove_all_delayed('foo', MyWorker, 'foo', 1, :bat => 'bar')## Returns the number of jobs removed## This method can be very expensive since it needs to scan# through the delayed queues of all timestampsdefremove_all_delayed_from_queue(queue,klass,*args)count=0item={'class'=>klass.to_s,'args'=>args}item['queue']=queue.to_sifqueuesearch=MultiJson.encode(item)Array(Sidekiq.redis{|r|r.keys("delayed:*")}).eachdo|key|count+=Sidekiq.redis{|r|r.lrem(key,0,search)}endcountend# Example usage:# Sidekiq::Client.remove_delayed(Time.now + 600, MyWorker, 'foo', 1, :bat => 'bar')## Returns the number of jobs removeddefremove_delayed(timestamp,klass,*args)remove_delayed_from_queue(nil,timestamp,klass,*args)end# Example usage:# Sidekiq::Client.remove_delayed('foo', Time.now + 600, MyWorker, 'foo', 1, :bat => 'bar')## Returns the number of jobs removeddefremove_delayed_from_queue(queue,timestamp,klass,*args)timestamp=timestamp.to_iitem={'class'=>klass.to_s,'args'=>args}item['queue']=queue.to_sifqueuesearch=MultiJson.encode(item)count=Sidekiq.redis{|r|r.lrem("delayed:#{timestamp}",0,search)}remove_scheduler_queue(timestamp)countendendendSidekiq::Client.send(:extend,SidekiqScheduler::Client)