Ruby on rails 3.2 Sidekiq工人使用a";海关;队列名称被分配给";“违约”;队列

Ruby on rails 3.2 Sidekiq工人使用a";海关;队列名称被分配给";“违约”;队列,ruby-on-rails-3.2,queue,sidekiq,Ruby On Rails 3.2,Queue,Sidekiq,如果我使用自定义队列名称定义一个类似于下面的worker 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 sidek

如果我使用自定义队列名称定义一个类似于下面的worker

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
它不工作(换句话说,不发送电子邮件)

在检查redis中的数据时,我发现:

  BulkEmailWorker.perform_async
redis 127.0.0.1:6379>

如上图所示,工人被分配到“默认”队列,我猜由于这个原因,工人无法处理。

对于上述场景,我使用以下命令启动了sidekiq:

  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\"}"
但是,当我从我的员工中移除以下内容时

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

    sidekiq_options(queue: :bulk_mails, backtrace: true)
它可以工作(换句话说,它成功地发送电子邮件)

/config/sidekiq.yml

我刚刚开始使用Sidekiq,而且是新手。所以如果我有一些概念我误解了或不知道,请容忍我

我需要解决上面提到的问题,以便将我的工作人员分配到所需的队列并成功处理

谢谢,
Jignesh

您可以在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
使用
-C config/sidekiq.yml
选项启动sidekiq。现在,您可以在worker中引用队列名称:

:queues:
- [bulk_mails, 7]
- [default, 5]

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

Sidekiq::Client.push({
“类”=>BulkEmailWorker,
“队列”=>“批量邮件”,
“args”=>[1,2]
})
请注意,键(
class
queue
args
必须是字符串,而不是符号,否则您将得到
ArgumentError:消息必须包含一个类和一组参数


当您需要将作业推送到具有变量名的队列(bulk_mails.1、bulk_mails.2等)上时,这一点特别有用,这样您就可以通过在某些队列上一次只允许一个作业来轻松地控制并发性。

感谢zwippie的回复。我刚刚收到@mperham at的评论。在()和[]之后没有空格被认为是一个好的代码风格指南。所以
[1,2]
应该是
[1,2]
:queues:
- [bulk_mails, 7]
- [default, 5]
sidekiq_options :queue => :bulk_mails