VRFS-1698 changed batch sending to one-at-a-time

This commit is contained in:
Jonathan Kolyer 2014-05-31 07:44:56 +00:00
parent 2fe78d84c2
commit b8736ff389
6 changed files with 58 additions and 12 deletions

View File

@ -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

View File

@ -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"

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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