ruby-on-rails-3.2 - 使用 "custom"队列名称的 Sidekiq 工作器被分配给 "default"队列

标签 ruby-on-rails-3.2 queue sidekiq

Rails 3.2.9
Ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux]
sidekiq  2.10.1

如果我使用自定义队列名称定义如下所示的 worker
  class BulkEmailWorker
    include Sidekiq::Worker
    # https://github.com/mperham/sidekiq/wiki/Advanced-Options
    sidekiq_options(queue: :bulk_mails, backtrace: true)

    # https://github.com/mperham/sidekiq/wiki/Best-Practices
    # Section: Make your jobs small and simple
    def perform
      # https://github.com/mperham/sidekiq/wiki/Delayed-Extensions
      scheduled_mails = MailTemplate.with_schedule
      scheduled_mails.each do |mail_template|
        BulkMailer.delay.general_mail(mail_template.id)
      end
    end
  end

我像这样调用 worker :
  BulkEmailWorker.perform_async

它不起作用(换句话说,它不发送电子邮件)。

检查 redis 中的数据,我发现以下内容:
  redis 127.0.0.1:6379> keys *
  1) "myapp:stat:processed:2013-04-24"
  2) "myapp:queue:default"
  3) "myapp:stat:processed"
  4) "myapp:queues"

  redis 127.0.0.1:6379> lrange myapp:queue:default -100 100

   1) "{\"retry\":true,\"queue\":\"default\",\"timeout\":30,\"class\":\"Sidekiq::Extensions::DelayedMailer\",\"args\":[\"---\\n- !ruby/class 'BulkMailer'\\n- :general_mail\\n- - 1\\n\"],\"jid\":\"e46693944febf7ae26ec67a0\"}"

Redis 127.0.0.1:6379>

从上面可以看出,工作人员被分配到队列“默认”,我猜因此工作人员无法处理。

对于上述场景,我使用以下命令启动了 sidekiq:
  bundle exec sidekiq -e dev_mysql -C config/sidekiq.yml -q bulk_mails

但是,当我从我的工作人员中删除以下内容时
    sidekiq_options(queue: :bulk_mails, backtrace: true)

并使用以下命令启动 sidekiq:
  bundle exec sidekiq -e dev_mysql -C config/sidekiq.yml

它有效(换句话说,它成功发送了电子邮件)。

/config/sidekiq.yml
# https://github.com/mperham/sidekiq/wiki/Logging
# http://stackoverflow.com/questions/15260634/sidekiq-configuration-for-multiple-environments
---
  :verbose: true
  :pidfile: ./tmp/pids/sidekiq.pid
  :logfile: ./log/sidekiq.log
  :concurrency:  25

我刚刚开始使用 Sidekiq 并且是新手。所以如果我有一些我误解或不知道的概念,请多多包涵。

我需要摆脱提到的问题,以便我的工作人员被分配到所需的队列并成功处理。

谢谢,
吉涅什

最佳答案

另外,请注意,您可以使用 Sidekiq::Client.push 将作业推送到您想要的队列中。而不是 perform_async :

Sidekiq::Client.push({
  'class' => BulkEmailWorker,
  'queue' => 'bulk_mails',
  'args'  => [ 1, 2 ]
})

请注意键( classqueueargs ) 必须是字符串,而不是符号,否则你会得到 ArgumentError: Message must include a class and set of arguments .

当您需要使用变量名(bulk_mails.1、bulk_mails.2 等)将作业推送到队列上时,这尤其有用,因此您可以轻松地 控制并发感谢 sidekiq-limit_fetch,在某些队列中一次只允许一项作业.

关于ruby-on-rails-3.2 - 使用 "custom"队列名称的 Sidekiq 工作器被分配给 "default"队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16194562/

相关文章:

c++ - 为什么字符串 operator= 上的 double free?

ruby - 如何在不重试中间件的情况下推回 sidekiq 作业?

ruby-on-rails - 开发环境中的 Sidekiq

ruby-on-rails - 如何在 Ruby on Rails 中下载 CSV 文件?

c - sys/queue.h错误: request for member in something not a structure or union (TAILQ)

ruby-on-rails - Rails 中的 Controller 和 View 中使用的辅助方法

c++ - std::queue 错误? pop 调用错误的 destroy 函数

heroku - 执行 sidekiq 登录 heroku

mysql - 是否有最佳实践/一致的方法来更新包含哈希键值存储的数据库字段?

ruby-on-rails-3.2 - 我可以使用 Guard/Spork 更改每次在 Rspec 中运行的随机化种子吗?