【问题标题】:Sending recurring emails with Sidekiq and Sidetiq使用 Sidekiq 和 Sidetiq 发送定期电子邮件
【发布时间】:2014-08-26 05:41:54
【问题描述】:

我在使用 Sidekiq 和 Sidetiq 发送定期邮件时遇到问题。我几乎尝试了所有方法,但没有找到解决方案。 我有 Sidekiq 工人,看起来像这样:

class InvoiceEmailSender
  include Sidekiq::Worker
  include Sidetiq::Schedulable

  recurrence {minutely(2)}
  def perform(invoice_id, action)
    @invoice = Invoice.find(invoice_id.to_i)
    if action == "invoice"
      send_invoice
    else
      send_reminder
    end
  end

  private
  def send_invoice
    if @invoice.delivery_date == Date.today
      InvoiceMailer.delay.send_invoice(@invoice)
    else
      InvoiceMailer.delay_for(@invoice.delivery_date.to_time).send_invoice(@invoice)
    end
  end

  def send_reminder
   InvoiceMailer.delay.send_invoice_reminder(@invoice) unless @invoice.paid?
  end
end

在控制器中结束我是这样使用的:

InvoiceEmailSender.perform_async(@invoice.id, "invoice")

当我尝试发送此电子邮件时,sidekiq 控制台中出现以下错误:

2014-08-26T05:36:01.107Z 4664 TID-otcc5idts WARN: {"retry"=>true, "queue"=>"default", "class"=>"InvoiceEmailSender", "args"=>[1409031120.0, 1409031240.0], "jid"=>"06dc732831c24e1a6f78d929", "enqueued_at"=>1409031120.7438812, "error_message"=>"Couldn't find Invoice with 'id'=1409031120", "error_class"=>"ActiveRecord::RecordNotFound", "failed_at"=>1409031249.1003482, "retry_count"=>2, "retried_at"=>1409031361.1066737}
2014-08-26T05:36:01.107Z 4664 TID-otcc5idts WARN: Couldn't find Invoice with 'id'=1409031120
2014-08-26T05:36:01.107Z 4664 TID-otcc5idts WARN: /home/mateusz/.rvm/gems/ruby-2.0.0-p0@rails4/gems/activerecord-4.1.2/lib/active_record/relation/finder_methods.rb:320:in `raise_record_not_found_exception!'

在计划选项卡中的 sideiq 网络监视器中,它看起来像这样:

请帮忙,因为我不知道发生了什么......

【问题讨论】:

    标签: ruby-on-rails ruby sidekiq sidetiq


    【解决方案1】:

    传入的数据看起来像纪元时间戳,事实证明 Sidetiq 将最后和当前时间作为 2 个参数传递给您的工作人员 according to the documentation

    我不确定您如何使用计划的工作人员使用自定义参数,您可能需要不同的策略,而不是尝试创建更多计划工作人员,只需 1 个(或两个,因为看起来像您让这个类做 2 个工作)调度的工作人员处理一个经常做的工作列表。

    【讨论】:

    • 非常感谢您的回复,但我仍然不知道如何解决这个问题。你能再给点建议吗?
    • 好吧,如果你不能使用参数,你需要让这些工作人员在一个已知的地方完成工作,比如你的数据库。他们醒来做他们的工作,询问需要做什么工作,做,然后回去睡觉。在您的控制器中,您可以使用InvoiceEmailTask.create(@invoice.id),而不是InvoiceEmailSender.perform_async(@invoice.id, "invoice")。如果您只使用现有的Invoice 对象,它可能会更简单,不确定,我不知道您的应用程序。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2017-01-27
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多