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

I'm just going to leave this here. No tests, beware.

This commit is contained in:
Mike Perham 2012-02-17 15:54:11 -08:00
parent 0a9a12cee8
commit 4fedfdf049
3 changed files with 77 additions and 0 deletions

View file

@ -0,0 +1,27 @@
require 'sidekiq/extensions/generic_proxy'
module Sidekiq
module Extensions
##
# Adds a 'delay' method to ActionMailer to offload arbitrary email
# delivery to Sidekiq. Example:
#
# UserMailer.delay.send_welcome_email(new_user)
class DelayedMailer
include Sidekiq::Worker
def perform(yml)
(target, method_name, args) = YAML.load(yml)
target.send(method_name, *args).deliver
end
end
module ActionMailer
def delay
Proxy.new(DelayedMailer, self)
end
end
::ActionMailer::Base.extend(ActionMailer)
end
end if defined?(::ActionMailer)

View file

@ -0,0 +1,29 @@
require 'sidekiq/extensions/generic_proxy'
module Sidekiq
module Extensions
##
# Adds a 'delay' method to ActiveRecord to offload arbitrary method
# execution to Sidekiq. Examples:
#
# User.delay.delete_inactive
# User.recent_signups.each { |user| user.delay.mark_as_awesome }
class DelayedModel
include Sidekiq::Worker
def perform(yml)
(target, method_name, args) = YAML.load(yml)
target.send(method_name, *args)
end
end
module ActiveRecord
def delay
Proxy.new(DelayedModel, self)
end
end
::ActiveRecord::Base.extend(ActiveRecord)
::ActiveRecord::Base.include(ActiveRecord)
end
end if defined?(::ActiveRecord)

View file

@ -0,0 +1,21 @@
module Sidekiq
module Extensions
class Proxy < BasicObject
def initialize(performable, target)
@performable = performable
@target = target
end
def method_missing(name, *args)
# Sidekiq has a limitation in that its message must be JSON.
# JSON can't round trip real Ruby objects so we use YAML to
# serialize the objects to a String. The YAML will be converted
# to JSON and then deserialized on the other side back into a
# Ruby object.
obj = [@target, name, args]
Sidekiq::Client.push('class' => @performable.name, 'args' => [YAML.dump(obj)])
end
end
end
end