提交 e2cdffce 编写于 作者: C Cliff Pruitt

Add config option for ActiveJob::Base.default_retry_jitter

上级 774e77c2
...@@ -7,6 +7,11 @@ module ActiveJob ...@@ -7,6 +7,11 @@ module ActiveJob
module Exceptions module Exceptions
extend ActiveSupport::Concern extend ActiveSupport::Concern
included do
class_attribute :default_retry_jitter, instance_accessor: false, instance_predicate: false
self.default_retry_jitter = 0.15
end
module ClassMethods module ClassMethods
# Catch the exception and reschedule job for re-execution after so many seconds, for a specific number of attempts. # Catch the exception and reschedule job for re-execution after so many seconds, for a specific number of attempts.
# If the exception keeps getting raised beyond the specified number of attempts, the exception is allowed to # If the exception keeps getting raised beyond the specified number of attempts, the exception is allowed to
...@@ -49,7 +54,7 @@ module ClassMethods ...@@ -49,7 +54,7 @@ module ClassMethods
# # Might raise Net::OpenTimeout or Timeout::Error when the remote service is down # # Might raise Net::OpenTimeout or Timeout::Error when the remote service is down
# end # end
# end # end
def retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil, jitter: 0.15) def retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil, jitter: nil)
rescue_from(*exceptions) do |error| rescue_from(*exceptions) do |error|
executions = executions_for(exceptions) executions = executions_for(exceptions)
if executions < attempts if executions < attempts
...@@ -122,7 +127,8 @@ def retry_job(options = {}) ...@@ -122,7 +127,8 @@ def retry_job(options = {})
end end
private private
def determine_delay(seconds_or_duration_or_algorithm:, executions:, jitter:) def determine_delay(seconds_or_duration_or_algorithm:, executions:, jitter: nil)
jitter ||= self.class.default_retry_jitter
case seconds_or_duration_or_algorithm case seconds_or_duration_or_algorithm
when :exponentially_longer when :exponentially_longer
((executions**4) + (Kernel.rand((executions**4) * jitter))) + 2 ((executions**4) + (Kernel.rand((executions**4) * jitter))) + 2
......
...@@ -129,6 +129,31 @@ class ExceptionsTest < ActiveSupport::TestCase ...@@ -129,6 +129,31 @@ class ExceptionsTest < ActiveSupport::TestCase
end end
end end
test "retry jitter uses value from ActiveJob::Base.default_retry_jitter by default" do
old_jitter = ActiveJob::Base.default_retry_jitter
ActiveJob::Base.default_retry_jitter = 4.0
travel_to Time.now
Kernel.stub(:rand, ->(arg) { arg }) do
RetryJob.perform_later "ExponentialWaitTenAttemptsError", 5, :log_scheduled_at
assert_equal [
"Raised ExponentialWaitTenAttemptsError for the 1st time",
"Next execution scheduled at #{(Time.now + 7.seconds).to_f}",
"Raised ExponentialWaitTenAttemptsError for the 2nd time",
"Next execution scheduled at #{(Time.now + 82.seconds).to_f}",
"Raised ExponentialWaitTenAttemptsError for the 3rd time",
"Next execution scheduled at #{(Time.now + 407.seconds).to_f}",
"Raised ExponentialWaitTenAttemptsError for the 4th time",
"Next execution scheduled at #{(Time.now + 1282.seconds).to_f}",
"Successfully completed job"
], JobBuffer.values
end
ensure
ActiveJob::Base.default_retry_jitter = old_jitter
end
test "custom wait retrying job" do test "custom wait retrying job" do
travel_to Time.now travel_to Time.now
......
...@@ -156,6 +156,10 @@ def load_defaults(target_version) ...@@ -156,6 +156,10 @@ def load_defaults(target_version)
when "6.1" when "6.1"
load_defaults "6.0" load_defaults "6.0"
if respond_to?(:active_job)
active_job.default_retry_jitter = 0.15
end
if respond_to?(:active_record) if respond_to?(:active_record)
active_record.has_many_inversing = true active_record.has_many_inversing = true
end end
......
...@@ -2262,6 +2262,20 @@ class ::DummySerializer < ActiveJob::Serializers::ObjectSerializer; end ...@@ -2262,6 +2262,20 @@ class ::DummySerializer < ActiveJob::Serializers::ObjectSerializer; end
end end
end end
test "ActiveJob::Base.default_retry_jitter is 0.15 by default" do
app "development"
assert_equal 0.15, ActiveJob::Base.default_retry_jitter
end
test "ActiveJob::Base.default_retry_jitter can be set by config" do
app "development"
Rails.application.config.active_job.default_retry_jitter = 0.22
assert_equal 0.22, ActiveJob::Base.default_retry_jitter
end
test "ActiveJob::Base.return_false_on_aborted_enqueue is true by default" do test "ActiveJob::Base.return_false_on_aborted_enqueue is true by default" do
app "development" app "development"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册