希望每2分钟发送一次电子邮件到excelsheet的电子邮件地址。
我尝试使用sidekiq和delayed_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
按代码排列,实际上没有什么可行的选择,只是有点怪异的东西
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分钟,您就会在队列中堆积工作人员。