MyWorker.perform_in(3.hours, 'mike', 1)
MyWorker.perform_at(3.hours.from_now, 'mike', 1)
我要 每天 00 点 00 分 开始的计划任务如何实现?!
别告诉我用 Resque ——!
不懂楼主的意思~ 不过我用过 clockwork 还不错..
另搭车问我想要每五分钟运行一个任务。怎么搞比较好呢..?
现在是跑一个 sidekiq, 然后再跑一个 clockwork, 感觉有点浪费啊..
whenever 是每隔指定时间重复做指定的任务,周而复始。而 sidekiq 是在你指定时刻做指定任务,如果成功,这个任务就从队列里移除,以后再也不做了;如果失败,超过指定的重试次数也会从队列里移除。
sidekiq 比较蛋疼的是不能在 app 运行时动态新建队列。比如我想要根据用户填写的邮箱的域新建队列,每个队列只往一个域发送邮件,就很难实现。我尝试过以下方式(在 Rails 4.0 里),但是邮件始终发不出去。
class MailWorkerPool
# 添加类级别的属性
class << self
attr_accessor :workers
end
def self.deliver_mail_async
# Worker类的容器,每个邮箱域一个Worker类
self.workers = {} unless self.workers
User.all.find_each do |user|
recipient = user.email
# 获取该用户邮箱的域(例如 gmail.com)
domain = recipient.split('@').last.to_sym
# 动态生成匿名Worker类,每个邮箱域一个
self.workers[domain] = Class.new do
include Sidekiq::Worker
# 经测试,domain变量是能获取到的
sidekiq_options queue: domain, retry: 5
def perform(recipient_email)
# 发送邮件
UserMailer.some_mail(recipient_email).deliver
end
end unless self.worker[domain]
# 使用匿名Worker类执行异步发送
worker[domain].perform_async(recipient)
end
end
end
失败的原因就是 sidekiq 不能动态新建队列。