From b8736ff3898f9729176d1feb8caff69b438928e9 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Sat, 31 May 2014 07:44:56 +0000 Subject: [PATCH] VRFS-1698 changed batch sending to one-at-a-time --- admin/app/admin/email_batch.rb | 2 +- ruby/lib/jam_ruby.rb | 1 + ruby/lib/jam_ruby/app/mailers/batch_mailer.rb | 9 +++--- ruby/lib/jam_ruby/models/email_batch.rb | 12 +++++--- ruby/lib/jam_ruby/models/email_batch_set.rb | 16 ++++++++-- ruby/lib/jam_ruby/resque/batch_email_job.rb | 30 +++++++++++++++++++ 6 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 ruby/lib/jam_ruby/resque/batch_email_job.rb diff --git a/admin/app/admin/email_batch.rb b/admin/app/admin/email_batch.rb index e5743eeb8..e31ec5cce 100644 --- a/admin/app/admin/email_batch.rb +++ b/admin/app/admin/email_batch.rb @@ -115,7 +115,7 @@ ActiveAdmin.register JamRuby::EmailBatch, :as => 'Batch Emails' do end member_action :batch_send, :method => :get do - resource.deliver_batch + resource.deliver_batch_async redirect_to admin_batch_email_path(resource.id) end diff --git a/ruby/lib/jam_ruby.rb b/ruby/lib/jam_ruby.rb index 64544ad7d..39686c778 100755 --- a/ruby/lib/jam_ruby.rb +++ b/ruby/lib/jam_ruby.rb @@ -43,6 +43,7 @@ require "jam_ruby/resque/scheduled/icecast_source_check" require "jam_ruby/resque/scheduled/cleanup_facebook_signup" require "jam_ruby/resque/scheduled/user_progress_emailer" require "jam_ruby/resque/google_analytics_event" +require "jam_ruby/resque/batch_email_job" require "jam_ruby/mq_router" require "jam_ruby/base_manager" require "jam_ruby/connection_manager" diff --git a/ruby/lib/jam_ruby/app/mailers/batch_mailer.rb b/ruby/lib/jam_ruby/app/mailers/batch_mailer.rb index 17f238090..19a0ea794 100644 --- a/ruby/lib/jam_ruby/app/mailers/batch_mailer.rb +++ b/ruby/lib/jam_ruby/app/mailers/batch_mailer.rb @@ -1,5 +1,6 @@ module JamRuby - class BatchMailer < JamRuby::AsyncMailer + class BatchMailer < ActionMailer::Base + include SendGrid layout "user_mailer" sendgrid_category :use_subject_lines @@ -23,10 +24,10 @@ module JamRuby end end - def send_batch_email(batch_id, user_ids) - users = User.find_all_by_id(user_ids) + def send_batch_email(batch_id, user_id) + user = User.find_by_id(user_id) batch = EmailBatch.find(batch_id) - self._send_batch(batch, users) + self._send_batch(batch, [user]) end def send_batch_email_test(batch_id) diff --git a/ruby/lib/jam_ruby/models/email_batch.rb b/ruby/lib/jam_ruby/models/email_batch.rb index a816ac422..8389c56c5 100644 --- a/ruby/lib/jam_ruby/models/email_batch.rb +++ b/ruby/lib/jam_ruby/models/email_batch.rb @@ -79,12 +79,12 @@ FOO end def deliver_batch_sets! - User.email_opt_in.find_in_batches(batch_size: BATCH_SIZE) do |users| - self.email_batch_sets << (bset = EmailBatchSet.load_set(self, users.map(&:id))) + User.email_opt_in.find_each do |user| + bset = EmailBatchSet.sent_email(self, user.id) if 'test' == Rails.env - BatchMailer.send_batch_email(self.id, bset.user_ids).deliver! + BatchMailer.send_batch_email(self.id, bset.user_id).deliver! else - BatchMailer.send_batch_email(self.id, bset.user_ids).deliver + BatchMailer.send_batch_email(self.id, bset.user_id).deliver end end end @@ -94,6 +94,10 @@ FOO self.deliver_batch_sets! end + def deliver_batch_async + BatchEmailJob.enqueue(self.id) + end + def test_count self.test_emails.split(',').count end diff --git a/ruby/lib/jam_ruby/models/email_batch_set.rb b/ruby/lib/jam_ruby/models/email_batch_set.rb index cdb963ad4..142d03169 100644 --- a/ruby/lib/jam_ruby/models/email_batch_set.rb +++ b/ruby/lib/jam_ruby/models/email_batch_set.rb @@ -5,12 +5,22 @@ module JamRuby belongs_to :email_batch, :class_name => 'JamRuby::EmailBatch' belongs_to :user, :class_name => 'JamRuby::User' - def self.load_set(batch, user_ids) + # def self.load_set(batch, user_ids) + # bset = self.new + # bset.email_batch_id = batch.id + # bset.user_ids = user_ids.join(',') + # bset.started_at = Time.now + # bset.batch_count = user_ids.size + # bset.save! + # bset + # end + + def self.sent_email(batch, user_id) bset = self.new bset.email_batch_id = batch.id - bset.user_ids = user_ids.join(',') + bset.user_id = user_id bset.started_at = Time.now - bset.batch_count = user_ids.size + bset.batch_count = 1 bset.save! bset end diff --git a/ruby/lib/jam_ruby/resque/batch_email_job.rb b/ruby/lib/jam_ruby/resque/batch_email_job.rb new file mode 100644 index 000000000..6d82d420e --- /dev/null +++ b/ruby/lib/jam_ruby/resque/batch_email_job.rb @@ -0,0 +1,30 @@ +require 'resque' +require 'resque-lonely_job' + +module JamRuby + class BatchEmailJob + extend Resque::Plugins::LonelyJob + + @@log = Logging.logger[BatchEmailJob] + + @queue = :batch_emails + + def self.perform(batch_id) + if ebatch = EmailBatch.find_by_id(batch_id) + ebatch.deliver_batch + end + end + + def self.enqueue(batch_id) + begin + Resque.enqueue(self, batch_id) + true + rescue + # implies redis is down. but since there is no retry logic with this, we should at least log a warn in case we've configured something wrong + @@log.warn("unable to enqueue") + false + end + end + + end +end