отправка писем через каждые 2 минуты на адреса электронной почты из таблицы Excelsheet - PullRequest
0 голосов
/ 25 октября 2019

Хотите отправлять электронные письма через каждые 2 минуты на адреса электронной почты из таблицы исключений.

Я пытался использовать sidekiq и delayed_job, но письма отправляются с задержкой, но в то же время.

Пробная задержка, delay_for и некоторые методы, но не помогающие

рабочий файл

class MarketingEmailsWorker
include Sidekiq::Worker 
def perform(*args)
    EmailList.read_file(args)
end

end

EmailList.rb модель

def self.read_file(record)
    list = EmailList.find(record).last
    spreadsheet = Roo::Spreadsheet.open(list.file.path, extension: :xlsx)
    header = spreadsheet.row(1)
    (2..spreadsheet.last_row).each do |i|
        row = Hash[[header, spreadsheet.row(i)].transpose]
        email = row["Email"]   
        if email.present?                                                                                                                                                                                 
            geography= row["Geography"].to_s
            lname = row["Name"]
            designation = row["Designation"]
            Notifier.send_template_mail(geography,email,lname,designation,list.emails_template).deliver_now
        end
    end
end

1 Ответ

0 голосов
/ 25 октября 2019

Codewise, на самом деле не существует жизнеспособного варианта, просто что-то странное, вроде

def perform(*args)
  while true do
    EmailList.read_file(args)
    sleep(120) # 2 minutes in seconds
  end
end

Но Я не рекомендую его для любой производственной системы . Поскольку вы не можете реально контролировать этого работника.


Лучший способ

решить эту проблему - использовать какой-нибудь планировщик Там вы можетенастроить YML с помощью cron, как у работников sidekiqСуществует множество опций для планирования ваших работников, например, cron: '*/2 * * * *' или every: '2m'.

Существует также опция планировщика для delayed_job с надежной документацией.

Примите во внимание, что, как только ваш работник займет больше 2 минут, вы соберете работников в очереди.

...