每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
答案 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分钟,您就会在队列中堆积工作人员。