加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails-3.2 – 使用“自定义”队列名称的Sidekiq worker

发布时间:2020-12-17 01:54:07 所属栏目:百科 来源:网络整理
导读:Rails 3.2.9Ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux]sidekiq 2.10.1 如果我使用自定义队列名称定义下面的工作者 class BulkEmailWorker include Sidekiq::Worker # https://github.com/mperham/sidekiq/wiki/Advanced-Options sidekiq_optio
Rails 3.2.9
Ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux]
sidekiq  2.10.1

如果我使用自定义队列名称定义下面的工作者

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_mailn- - 1n"],"jid":"e46693944febf7ae26ec67a0"}"

redis 127.0.0.1:6379u0026gt;

从上面可以看出,工作人员被分配到队列“默认”,我想由于这个原因,工人无法处理.

我在上面的场景中使用以下命令启动了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
# https://stackoverflow.com/questions/15260634/sidekiq-configuration-for-multiple-environments
---
  :verbose: true
  :pidfile: ./tmp/pids/sidekiq.pid
  :logfile: ./log/sidekiq.log
  :concurrency:  25

我刚刚开始使用Sidekiq并且是新手.如果我有一些我误解或不知道的概念,请跟我说.

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

谢谢,
Jignesh

解决方法

另外,请注意您可以使用Sidekiq :: Client.push而不是perform_async在所需队列上推送作业:

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

请注意,键(class,queue,args)必须是字符串,而不是符号,否则您将获得ArgumentError:Message必须包含一个类和一组参数.

当您需要在具有变量名称的队列(bulk_mails.1,bulk_mails.2等)上推送作业时,这尤其有用,因此您可以通过在某些队列中一次只允许一个作业来轻松控制并发性,谢谢到sidekiq-limit_fetch.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读