【发布时间】:2018-11-05 14:51:10
【问题描述】:
在我的应用程序中,我尝试按顺序执行两个工作任务。 首先,使用 Wicked pdf 创建 PDF,然后在创建 PDF 后,向两个不同的收件人发送附有 PDF 的电子邮件。
这是在控制器中调用的:
PdfWorker.perform_async(@d.id)
MailingWorker.perform_in(1.minutes, @d.id,@d.class.name.to_s)
第一个工作人员创建 PDF,第二个工作人员发送电子邮件。
这是第二个工人:
class MailingWorker
include Sidekiq::Worker
sidekiq_options retry: false
def perform(d_id,model)
@d = eval(model).find(d_id)
@model = model
if @d.pdf.present?
ProfessionnelMailer.notification_d(@d).deliver
ClientMailer.notification_d(@d).deliver
else
MailingWorker.perform_in(1.minutes, @d.id, @model.to_s)
end
end
end
if 语句检查 PDF 是否已创建。如果真的发送了两封邮件,否则一分钟后再次调用同一个工作人员,只是为了让 Heroku 服务器有额外的时间来处理 PDF 创建,以防需要更多时间或排长队。
虽然如果 PDF 确实无法处理,上述内容最终会陷入无限循环。
有没有办法解决这个问题?
我看到的一个选项是在 PDF 创建工作人员中调用第二个工作人员,尽管我真的不想将工作人员嵌套得太深。将它们分开使我的控制器更加清晰,我可以看到操作的顺序。但欢迎提出任何建议。
另一种选择是使用 sidekiq_options retry: 5 并请求重试控制器,该重试可计入全部重试 5 次,而不是使用 else MailingWorker.perform_in(1.minutes, @d.id, @model.to_s) 重试工作人员,但我不知道该怎么做。根据这个线程https://github.com/mperham/sidekiq/issues/769,它会引发一个异常,但我不知道该怎么做......(我也不确定在使用异常方法处理之前重试将等待多长时间,使用上面的解决方案我可以控制时间范围..)
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-5 sidekiq