1
0
Fork 0
mirror of https://github.com/mperham/sidekiq.git synced 2022-11-09 13:52:34 -05:00

Add extension to delay any arbitrary class method to Sidekiq.

This commit is contained in:
Mike Perham 2012-08-16 16:43:01 -07:00
parent 2655c17bde
commit e55979407a
7 changed files with 63 additions and 6 deletions

View file

@ -1,6 +1,13 @@
HEAD HEAD
----------- -----------
- Add extension to delay any arbitrary class method to Sidekiq.
Previously this was limited to ActiveRecord classes.
```ruby
SomeClass.delay.class_method(1, 'mike', Date.today)
```
- Sidekiq::Client now generates and returns a random, 128-bit Job ID 'jid' which - Sidekiq::Client now generates and returns a random, 128-bit Job ID 'jid' which
can be used to track the processing of a Job, e.g. for calling back to a webhook can be used to track the processing of a Job, e.g. for calling back to a webhook
when a job is finished. when a job is finished.

View file

@ -5,6 +5,7 @@ require 'sidekiq/worker'
require 'sidekiq/redis_connection' require 'sidekiq/redis_connection'
require 'sidekiq/util' require 'sidekiq/util'
require 'sidekiq/extensions/class_methods'
require 'sidekiq/extensions/action_mailer' require 'sidekiq/extensions/action_mailer'
require 'sidekiq/extensions/active_record' require 'sidekiq/extensions/active_record'
require 'sidekiq/rails' if defined?(::Rails::Engine) require 'sidekiq/rails' if defined?(::Rails::Engine)

View file

@ -3,11 +3,14 @@ require 'sidekiq/extensions/generic_proxy'
module Sidekiq module Sidekiq
module Extensions module Extensions
## ##
# Adds a 'delay' method to ActiveRecord to offload arbitrary method # Adds a 'delay' method to ActiveRecords to offload instance method
# execution to Sidekiq. Examples: # execution to Sidekiq. Examples:
# #
# User.delay.delete_inactive
# User.recent_signups.each { |user| user.delay.mark_as_awesome } # User.recent_signups.each { |user| user.delay.mark_as_awesome }
#
# Please note, this is not recommended as this will serialize the entire
# object to Redis. Your Sidekiq jobs should pass IDs, not entire instances.
# This is here for backwards compatibility with Delayed::Job only.
class DelayedModel class DelayedModel
include Sidekiq::Worker include Sidekiq::Worker

View file

@ -0,0 +1,33 @@
require 'sidekiq/extensions/generic_proxy'
module Sidekiq
module Extensions
##
# Adds a 'delay' method to all Classes to offload class method
# execution to Sidekiq. Examples:
#
# User.delay.delete_inactive
# Wikipedia.delay.download_changes_for(Date.today)
#
class DelayedClass
include Sidekiq::Worker
def perform(yml)
(target, method_name, args) = YAML.load(yml)
target.send(method_name, *args)
end
end
module Klass
def delay
Proxy.new(DelayedClass, self)
end
def delay_for(interval)
Proxy.new(DelayedClass, self, Time.now.to_f + interval.to_f)
end
end
end
end
Class.send(:include, Sidekiq::Extensions::Klass)

View file

@ -2,7 +2,6 @@ module Sidekiq
def self.hook_rails! def self.hook_rails!
return unless Sidekiq.options[:enable_rails_extensions] return unless Sidekiq.options[:enable_rails_extensions]
if defined?(ActiveRecord) if defined?(ActiveRecord)
ActiveRecord::Base.extend(Sidekiq::Extensions::ActiveRecord)
ActiveRecord::Base.send(:include, Sidekiq::Extensions::ActiveRecord) ActiveRecord::Base.send(:include, Sidekiq::Extensions::ActiveRecord)
end end

View file

@ -54,6 +54,15 @@ class TestExtensions < MiniTest::Unit::TestCase
UserMailer.delay_for(5.days).greetings(1, 2) UserMailer.delay_for(5.days).greetings(1, 2)
assert_equal 1, Sidekiq.redis {|c| c.zcard('schedule') } assert_equal 1, Sidekiq.redis {|c| c.zcard('schedule') }
end end
class SomeClass
def self.doit(arg)
end
end
it 'allows delay of any ole class method' do
SomeClass.delay.doit(Date.today)
end
end end
describe 'sidekiq rails extensions configuration' do describe 'sidekiq rails extensions configuration' do

View file

@ -76,10 +76,15 @@ class TestTesting < MiniTest::Unit::TestCase
assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs.size assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs.size
end end
class Something
def self.foo(x)
end
end
it 'stubs the delay call on models' do it 'stubs the delay call on models' do
assert_equal 0, Sidekiq::Extensions::DelayedModel.jobs.size assert_equal 0, Sidekiq::Extensions::DelayedClass.jobs.size
FooModel.delay.bar('hello!') Something.delay.foo(Date.today)
assert_equal 1, Sidekiq::Extensions::DelayedModel.jobs.size assert_equal 1, Sidekiq::Extensions::DelayedClass.jobs.size
end end
it 'stubs the enqueue call' do it 'stubs the enqueue call' do