每2分钟发送一次电子邮件到excelsheet的电子邮件地址

时间:2019-10-25 06:46:12

标签: ruby ruby-on-rails-4 actionmailer sidekiq delayed-job

每2分钟想发送一次电子邮件到excelsheet的电子邮件地址。

我尝试使用sidekiq和delay_job,但电子邮件在延迟后却同时拍摄。

尝试了delay,delay_for和一些方法,但没有帮助

工作文件

class MarketingEmailsWorker
include Sidekiq::Worker 
def perform(*args)
    EmailList.read_file(args)
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 :(得分:0)

从代码角度讲,只有怪异的东西真的没有可行的选择

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

但是我不建议将其用于任何生产系统。因为您无法真正控制那个工人。


更好的方式

要解决此问题,将使用一些scheduler 在那里,您可以像sidekiq worker一样使用cron设置yml。 有很多选择可以安排您的工人,例如cron: '*/2 * * * *'every: '2m'

delayed_job还有一个调度程序选项,带有可靠的文档。

要考虑到,一旦您的工作人员处理时间超过2分钟,您就会在队列中堆积工作人员。

相关问题