2013-04-24 53 views
3
Rails 3.2.9 
Ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux] 
sidekiq 2.10.1 

如果我定義了一個工人象下面這樣一個自定義隊列名稱Sidekiq工人被分配到「默認」隊列

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 

,我調用工人是這樣的:

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剛剛開始,我新手it.So請原諒,如果我有一些概念,我誤解或不瞭解有關。

我需要擺脫上述問題,以便我的工作人員被分配到所需的隊列,並且也成功處理。

感謝, Jignesh

回答

6

您可以在sidekiq.yml配置文件中加入隊列名稱和重量:

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

開始sidekiq與-C config/sidekiq.yml選項。現在,你可以參考的隊列名稱在你的工人:

sidekiq_options :queue => :bulk_mails 
+1

感謝zwippie您的回覆。我剛剛收到來自@mperham的評論,網址是https://github.com/mperham/sidekiq/issues/872。 – 2013-04-25 19:12:02

15

另外,請注意,您可以通過使用Sidekiq::Client.push而不是perform_async你想要的隊列推工作:

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

注意密鑰(class,queue,args必須是是字符串,而不是符號,否則您將獲得ArgumentError: Message must include a class and set of arguments

當你需要在隊列推進工作與變量名(bulk_mails.1,bulk_mails.2等),這是非常有用,這樣你就可以輕鬆地控制併發允許在只有一個作業時間在一些隊列上,感謝sidekiq-limit_fetch

+0

將()和[]之後的空格視爲不錯的代碼風格指南。所以'[1,2]'應該是'[1,2]'。 https://github.com/bbatsov/ruby-style-guide#no-spaces-braces – 2016-02-02 11:46:34