aboutsummaryrefslogtreecommitdiffstats
path: root/actionmailer/lib/action_mailer/async.rb
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2012-06-26 00:04:09 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2012-06-26 00:04:09 -0700
commitee74366da35a41d9ec02c42f27086410538f3a9c (patch)
tree9920b3c72f28d6d81e63e4ec3372d2f99d19cf88 /actionmailer/lib/action_mailer/async.rb
parent755d1636107f814c6e0f76e7b3f327b9b4bdcc07 (diff)
parent35717a9370e4d0ee312aa591bc2674004cfbadba (diff)
downloadrails-ee74366da35a41d9ec02c42f27086410538f3a9c.tar.gz
rails-ee74366da35a41d9ec02c42f27086410538f3a9c.tar.bz2
rails-ee74366da35a41d9ec02c42f27086410538f3a9c.zip
Merge pull request #6839 from bcardarella/async-actionmailer
Async actionmailer
Diffstat (limited to 'actionmailer/lib/action_mailer/async.rb')
-rw-r--r--actionmailer/lib/action_mailer/async.rb39
1 files changed, 39 insertions, 0 deletions
diff --git a/actionmailer/lib/action_mailer/async.rb b/actionmailer/lib/action_mailer/async.rb
new file mode 100644
index 0000000000..86a5b0d035
--- /dev/null
+++ b/actionmailer/lib/action_mailer/async.rb
@@ -0,0 +1,39 @@
+require 'delegate'
+
+module ActionMailer::Async
+ def method_missing(method_name, *args)
+ if action_methods.include?(method_name.to_s)
+ QueuedMessage.new(queue, self, method_name, *args)
+ else
+ super
+ end
+ end
+
+ def queue
+ Rails.queue
+ end
+
+ class QueuedMessage < ::Delegator
+ attr_reader :queue
+
+ def initialize(queue, mailer_class, method_name, *args)
+ @queue = queue
+ @mailer_class = mailer_class
+ @method_name = method_name
+ @args = args
+ end
+
+ def __getobj__
+ @actual_message ||= @mailer_class.send(:new, @method_name, *@args).message
+ end
+
+ def run
+ __getobj__.deliver
+ end
+
+ # Will push the message onto the Queue to be processed
+ def deliver
+ @queue << self
+ end
+ end
+end