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:
parent
0a9a12cee8
commit
4fedfdf049
3 changed files with 77 additions and 0 deletions
27
lib/sidekiq/extensions/action_mailer.rb
Normal file
27
lib/sidekiq/extensions/action_mailer.rb
Normal 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)
|
29
lib/sidekiq/extensions/active_record.rb
Normal file
29
lib/sidekiq/extensions/active_record.rb
Normal 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)
|
21
lib/sidekiq/extensions/generic_proxy.rb
Normal file
21
lib/sidekiq/extensions/generic_proxy.rb
Normal 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
|
Loading…
Add table
Reference in a new issue