sch*_*cho 19 sidekiq rails-activejob
从Rails API,我发现ActiveJob可以retry_job间隔:
my_job_instance.enqueue
my_job_instance.enqueue wait: 5.minutes
my_job_instance.enqueue queue: :important
my_job_instance.enqueue wait_until: Date.tomorrow.midnight
Run Code Online (Sandbox Code Playgroud)
但是如果我想设置重试计数,比如Sidekiq:
include Sidekiq::Worker
sidekiq_options :retry => 5
Run Code Online (Sandbox Code Playgroud)
该示例代码怎么办?
class SiteScrapperJob < ActiveJob::Base
rescue_from(ErrorLoadingSite) do
retry_job queue: :low_priority
end
def perform(*args)
# raise ErrorLoadingSite if cannot scrape
end
end
Run Code Online (Sandbox Code Playgroud)
现在我把它添加到我的工作班:
Sidekiq.default_worker_options = { retry: 5 }
Run Code Online (Sandbox Code Playgroud)
但似乎不是很好.
Vin*_*ira 18
您也可能对此解决方案感兴趣,该解决方案使用serialize和deserializeapi来存储尝试次数.
class DeliverWebhookJob < ActiveJob::Base
def serialize
super.merge('attempt_number' => (@attempt_number || 0) + 1)
end
def deserialize(job_data)
super
@attempt_number = job_data['attempt_number']
end
rescue_from(ErrorLoadingSite) do |exception|
retry_job(wait: 10) if @attempt_number < 5
end
def perform(*args)
# raise ErrorLoadingSite if cannot scrape
end
end
Run Code Online (Sandbox Code Playgroud)
从这里拿走它.
hat*_*a91 14
从Rails 5.1开始,有一种使用retry_on方法执行此操作的内置方法.它是一个通用的ActiveJob方法,因此它可以与任何排队后端一起使用,而不仅仅是Sidekiq.
例如,对于您的具体工作,您可以:
class SiteScraperJob < ActiveJob::Base
retry_on ErrorLoadingSite, queue: :low_priority, attempts: 5
def perform(*args)
# raise ErrorLoadingSite if cannot scrape
end
end
Run Code Online (Sandbox Code Playgroud)
您还可以设置常量等待间隔或指数等待策略,如文档中所述.
Mik*_*ham 13
你不能.如果您想使用Sidekiq特定的东西,您需要使用Sidekiq特定的API.ActiveJob不会暴露Sidekiq的重试机制.
| 归档时间: |
|
| 查看次数: |
9852 次 |
| 最近记录: |