aboutsummaryrefslogtreecommitdiffstats
path: root/actionmailer/lib
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2012-09-16 18:30:23 -0700
committerJeremy Kemper <jeremy@bitsweat.net>2012-09-16 22:37:47 -0700
commit2a301505ece91b1bf317c6627aaba7ec0cea43e9 (patch)
treeca01f2d6bf360fe884721ee48a19f3b2a2aaed1c /actionmailer/lib
parentb881be7331339d7eab50ccf0512de3ab4e49a896 (diff)
downloadrails-2a301505ece91b1bf317c6627aaba7ec0cea43e9.tar.gz
rails-2a301505ece91b1bf317c6627aaba7ec0cea43e9.tar.bz2
rails-2a301505ece91b1bf317c6627aaba7ec0cea43e9.zip
Use synchronous queue by default. Separate queued message delivery jobs from the queued message wrappers so the queue itself needn't be marshaled (due to queue reference QueuedMessage).
Diffstat (limited to 'actionmailer/lib')
-rw-r--r--actionmailer/lib/action_mailer/base.rb2
-rw-r--r--actionmailer/lib/action_mailer/queued_message.rb30
2 files changed, 22 insertions, 10 deletions
diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb
index 26787c9b5e..1676c23856 100644
--- a/actionmailer/lib/action_mailer/base.rb
+++ b/actionmailer/lib/action_mailer/base.rb
@@ -4,6 +4,7 @@ require 'action_mailer/collector'
require 'active_support/core_ext/string/inflections'
require 'active_support/core_ext/hash/except'
require 'active_support/core_ext/module/anonymous'
+require 'active_support/queueing'
require 'action_mailer/log_subscriber'
module ActionMailer #:nodoc:
@@ -393,6 +394,7 @@ module ActionMailer #:nodoc:
}.freeze
class_attribute :queue
+ self.queue = ActiveSupport::SynchronousQueue.new
class << self
# Register one or more Observers which will be notified when mail is delivered.
diff --git a/actionmailer/lib/action_mailer/queued_message.rb b/actionmailer/lib/action_mailer/queued_message.rb
index e5868ab43b..8d200617c4 100644
--- a/actionmailer/lib/action_mailer/queued_message.rb
+++ b/actionmailer/lib/action_mailer/queued_message.rb
@@ -5,23 +5,33 @@ module ActionMailer
attr_reader :queue
def initialize(queue, mailer_class, method_name, *args)
- @queue = queue
- @mailer_class = mailer_class
- @method_name = method_name
- @args = args
+ @queue = queue
+ @job = DeliveryJob.new(mailer_class, method_name, args)
end
def __getobj__
- @actual_message ||= @mailer_class.send(:new, @method_name, *@args).message
+ @job.message
end
- def run
- __getobj__.deliver
+ # Queues the message for delivery.
+ def deliver
+ tap { @queue.push @job }
end
- # Will push the message onto the Queue to be processed
- def deliver
- @queue << self
+ class DeliveryJob
+ def initialize(mailer_class, method_name, args)
+ @mailer_class = mailer_class
+ @method_name = method_name
+ @args = args
+ end
+
+ def message
+ @message ||= @mailer_class.send(:new, @method_name, *@args).message
+ end
+
+ def run
+ message.deliver
+ end
end
end
end