$ rvm use --default 1.9.3-pxxx 默认使用 1.9.3-pxxx 版本,以后不用再输入了,除非你想把默认版本改了。
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 不能动态新建队列。
whenever 是每隔指定时间重复做指定的任务,周而复始。而 sidekiq 是在你指定时刻做指定任务,如果成功,这个任务就从队列里移除,以后再也不做了;如果失败,超过指定的重试次数也会从队列里移除。