• 执行 rails 命令出错 at August 16, 2013

    $ 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 是在你指定时刻做指定任务,如果成功,这个任务就从队列里移除,以后再也不做了;如果失败,超过指定的重试次数也会从队列里移除。