sidekiq 5.2.8 → 6.1.3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sidekiq might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
- data/.github/workflows/ci.yml +41 -0
- data/.gitignore +0 -2
- data/.standard.yml +20 -0
- data/5.0-Upgrade.md +1 -1
- data/6.0-Upgrade.md +72 -0
- data/Changes.md +196 -0
- data/Ent-2.0-Upgrade.md +37 -0
- data/Ent-Changes.md +72 -1
- data/Gemfile +12 -11
- data/Gemfile.lock +193 -0
- data/Pro-5.0-Upgrade.md +25 -0
- data/Pro-Changes.md +56 -2
- data/README.md +18 -34
- data/Rakefile +5 -4
- data/bin/sidekiq +26 -2
- data/bin/sidekiqload +32 -24
- data/bin/sidekiqmon +8 -0
- data/lib/generators/sidekiq/templates/worker_test.rb.erb +1 -1
- data/lib/generators/sidekiq/worker_generator.rb +21 -13
- data/lib/sidekiq/api.rb +245 -219
- data/lib/sidekiq/cli.rb +144 -180
- data/lib/sidekiq/client.rb +68 -48
- data/lib/sidekiq/delay.rb +5 -6
- data/lib/sidekiq/exception_handler.rb +10 -12
- data/lib/sidekiq/extensions/action_mailer.rb +13 -22
- data/lib/sidekiq/extensions/active_record.rb +13 -10
- data/lib/sidekiq/extensions/class_methods.rb +14 -11
- data/lib/sidekiq/extensions/generic_proxy.rb +4 -4
- data/lib/sidekiq/fetch.rb +29 -30
- data/lib/sidekiq/job_logger.rb +45 -7
- data/lib/sidekiq/job_retry.rb +62 -61
- data/lib/sidekiq/launcher.rb +112 -54
- data/lib/sidekiq/logger.rb +166 -0
- data/lib/sidekiq/manager.rb +11 -13
- data/lib/sidekiq/middleware/chain.rb +15 -5
- data/lib/sidekiq/middleware/i18n.rb +5 -7
- data/lib/sidekiq/monitor.rb +133 -0
- data/lib/sidekiq/paginator.rb +18 -14
- data/lib/sidekiq/processor.rb +71 -70
- data/lib/sidekiq/rails.rb +29 -37
- data/lib/sidekiq/redis_connection.rb +50 -48
- data/lib/sidekiq/scheduled.rb +28 -29
- data/lib/sidekiq/sd_notify.rb +149 -0
- data/lib/sidekiq/systemd.rb +24 -0
- data/lib/sidekiq/testing/inline.rb +2 -1
- data/lib/sidekiq/testing.rb +35 -24
- data/lib/sidekiq/util.rb +17 -16
- data/lib/sidekiq/version.rb +2 -1
- data/lib/sidekiq/web/action.rb +14 -10
- data/lib/sidekiq/web/application.rb +74 -72
- data/lib/sidekiq/web/csrf_protection.rb +156 -0
- data/lib/sidekiq/web/helpers.rb +97 -77
- data/lib/sidekiq/web/router.rb +18 -17
- data/lib/sidekiq/web.rb +53 -53
- data/lib/sidekiq/worker.rb +126 -102
- data/lib/sidekiq.rb +69 -44
- data/sidekiq.gemspec +15 -16
- data/web/assets/javascripts/application.js +25 -27
- data/web/assets/javascripts/dashboard.js +4 -23
- data/web/assets/stylesheets/application-dark.css +149 -0
- data/web/assets/stylesheets/application.css +28 -6
- data/web/locales/de.yml +14 -2
- data/web/locales/en.yml +2 -0
- data/web/locales/fr.yml +3 -3
- data/web/locales/ja.yml +4 -1
- data/web/locales/lt.yml +83 -0
- data/web/locales/pl.yml +4 -4
- data/web/locales/ru.yml +4 -0
- data/web/locales/vi.yml +83 -0
- data/web/views/_job_info.erb +2 -1
- data/web/views/busy.erb +8 -3
- data/web/views/dead.erb +2 -2
- data/web/views/layout.erb +1 -0
- data/web/views/morgue.erb +5 -2
- data/web/views/queue.erb +10 -1
- data/web/views/queues.erb +9 -1
- data/web/views/retries.erb +5 -2
- data/web/views/retry.erb +2 -2
- data/web/views/scheduled.erb +5 -2
- metadata +31 -49
- data/.circleci/config.yml +0 -61
- data/.github/issue_template.md +0 -11
- data/.travis.yml +0 -11
- data/bin/sidekiqctl +0 -20
- data/lib/sidekiq/core_ext.rb +0 -1
- data/lib/sidekiq/ctl.rb +0 -221
- data/lib/sidekiq/logging.rb +0 -122
- data/lib/sidekiq/middleware/server/active_record.rb +0 -23
data/lib/sidekiq/worker.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'sidekiq/client'
|
3
2
|
|
4
|
-
|
3
|
+
require "sidekiq/client"
|
5
4
|
|
5
|
+
module Sidekiq
|
6
6
|
##
|
7
7
|
# Include this module in your worker class and you can easily create
|
8
8
|
# asynchronous jobs:
|
@@ -21,15 +21,124 @@ module Sidekiq
|
|
21
21
|
#
|
22
22
|
# Note that perform_async is a class method, perform is an instance method.
|
23
23
|
module Worker
|
24
|
+
##
|
25
|
+
# The Options module is extracted so we can include it in ActiveJob::Base
|
26
|
+
# and allow native AJs to configure Sidekiq features/internals.
|
27
|
+
module Options
|
28
|
+
def self.included(base)
|
29
|
+
base.extend(ClassMethods)
|
30
|
+
base.sidekiq_class_attribute :sidekiq_options_hash
|
31
|
+
base.sidekiq_class_attribute :sidekiq_retry_in_block
|
32
|
+
base.sidekiq_class_attribute :sidekiq_retries_exhausted_block
|
33
|
+
end
|
34
|
+
|
35
|
+
module ClassMethods
|
36
|
+
ACCESSOR_MUTEX = Mutex.new
|
37
|
+
|
38
|
+
##
|
39
|
+
# Allows customization for this type of Worker.
|
40
|
+
# Legal options:
|
41
|
+
#
|
42
|
+
# queue - name of queue to use for this job type, default *default*
|
43
|
+
# retry - enable retries for this Worker in case of error during execution,
|
44
|
+
# *true* to use the default or *Integer* count
|
45
|
+
# backtrace - whether to save any error backtrace in the retry payload to display in web UI,
|
46
|
+
# can be true, false or an integer number of lines to save, default *false*
|
47
|
+
#
|
48
|
+
# In practice, any option is allowed. This is the main mechanism to configure the
|
49
|
+
# options for a specific job.
|
50
|
+
def sidekiq_options(opts = {})
|
51
|
+
opts = opts.transform_keys(&:to_s) # stringify
|
52
|
+
self.sidekiq_options_hash = get_sidekiq_options.merge(opts)
|
53
|
+
end
|
54
|
+
|
55
|
+
def sidekiq_retry_in(&block)
|
56
|
+
self.sidekiq_retry_in_block = block
|
57
|
+
end
|
58
|
+
|
59
|
+
def sidekiq_retries_exhausted(&block)
|
60
|
+
self.sidekiq_retries_exhausted_block = block
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_sidekiq_options # :nodoc:
|
64
|
+
self.sidekiq_options_hash ||= Sidekiq.default_worker_options
|
65
|
+
end
|
66
|
+
|
67
|
+
def sidekiq_class_attribute(*attrs)
|
68
|
+
instance_reader = true
|
69
|
+
instance_writer = true
|
70
|
+
|
71
|
+
attrs.each do |name|
|
72
|
+
synchronized_getter = "__synchronized_#{name}"
|
73
|
+
|
74
|
+
singleton_class.instance_eval do
|
75
|
+
undef_method(name) if method_defined?(name) || private_method_defined?(name)
|
76
|
+
end
|
77
|
+
|
78
|
+
define_singleton_method(synchronized_getter) { nil }
|
79
|
+
singleton_class.class_eval do
|
80
|
+
private(synchronized_getter)
|
81
|
+
end
|
82
|
+
|
83
|
+
define_singleton_method(name) { ACCESSOR_MUTEX.synchronize { send synchronized_getter } }
|
84
|
+
|
85
|
+
ivar = "@#{name}"
|
86
|
+
|
87
|
+
singleton_class.instance_eval do
|
88
|
+
m = "#{name}="
|
89
|
+
undef_method(m) if method_defined?(m) || private_method_defined?(m)
|
90
|
+
end
|
91
|
+
define_singleton_method("#{name}=") do |val|
|
92
|
+
singleton_class.class_eval do
|
93
|
+
ACCESSOR_MUTEX.synchronize do
|
94
|
+
undef_method(synchronized_getter) if method_defined?(synchronized_getter) || private_method_defined?(synchronized_getter)
|
95
|
+
define_method(synchronized_getter) { val }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
if singleton_class?
|
100
|
+
class_eval do
|
101
|
+
undef_method(name) if method_defined?(name) || private_method_defined?(name)
|
102
|
+
define_method(name) do
|
103
|
+
if instance_variable_defined? ivar
|
104
|
+
instance_variable_get ivar
|
105
|
+
else
|
106
|
+
singleton_class.send name
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
val
|
112
|
+
end
|
113
|
+
|
114
|
+
if instance_reader
|
115
|
+
undef_method(name) if method_defined?(name) || private_method_defined?(name)
|
116
|
+
define_method(name) do
|
117
|
+
if instance_variable_defined?(ivar)
|
118
|
+
instance_variable_get ivar
|
119
|
+
else
|
120
|
+
self.class.public_send name
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
if instance_writer
|
126
|
+
m = "#{name}="
|
127
|
+
undef_method(m) if method_defined?(m) || private_method_defined?(m)
|
128
|
+
attr_writer name
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
24
135
|
attr_accessor :jid
|
25
136
|
|
26
137
|
def self.included(base)
|
27
|
-
raise ArgumentError, "
|
138
|
+
raise ArgumentError, "Sidekiq::Worker cannot be included in an ActiveJob: #{base.name}" if base.ancestors.any? { |c| c.name == "ActiveJob::Base" }
|
28
139
|
|
140
|
+
base.include(Options)
|
29
141
|
base.extend(ClassMethods)
|
30
|
-
base.sidekiq_class_attribute :sidekiq_options_hash
|
31
|
-
base.sidekiq_class_attribute :sidekiq_retry_in_block
|
32
|
-
base.sidekiq_class_attribute :sidekiq_retries_exhausted_block
|
33
142
|
end
|
34
143
|
|
35
144
|
def logger
|
@@ -52,7 +161,7 @@ module Sidekiq
|
|
52
161
|
end
|
53
162
|
|
54
163
|
def perform_async(*args)
|
55
|
-
@klass.client_push(@opts.merge(
|
164
|
+
@klass.client_push(@opts.merge("args" => args, "class" => @klass))
|
56
165
|
end
|
57
166
|
|
58
167
|
# +interval+ must be a timestamp, numeric or something that acts
|
@@ -62,17 +171,15 @@ module Sidekiq
|
|
62
171
|
now = Time.now.to_f
|
63
172
|
ts = (int < 1_000_000_000 ? now + int : int)
|
64
173
|
|
65
|
-
payload = @opts.merge(
|
174
|
+
payload = @opts.merge("class" => @klass, "args" => args)
|
66
175
|
# Optimization to enqueue something now that is scheduled to go out now or in the past
|
67
|
-
payload
|
176
|
+
payload["at"] = ts if ts > now
|
68
177
|
@klass.client_push(payload)
|
69
178
|
end
|
70
179
|
alias_method :perform_at, :perform_in
|
71
180
|
end
|
72
181
|
|
73
182
|
module ClassMethods
|
74
|
-
ACCESSOR_MUTEX = Mutex.new
|
75
|
-
|
76
183
|
def delay(*args)
|
77
184
|
raise ArgumentError, "Do not call .delay on a Sidekiq::Worker class, call .perform_async"
|
78
185
|
end
|
@@ -90,7 +197,7 @@ module Sidekiq
|
|
90
197
|
end
|
91
198
|
|
92
199
|
def perform_async(*args)
|
93
|
-
client_push(
|
200
|
+
client_push("class" => self, "args" => args)
|
94
201
|
end
|
95
202
|
|
96
203
|
# +interval+ must be a timestamp, numeric or something that acts
|
@@ -100,10 +207,10 @@ module Sidekiq
|
|
100
207
|
now = Time.now.to_f
|
101
208
|
ts = (int < 1_000_000_000 ? now + int : int)
|
102
209
|
|
103
|
-
item = {
|
210
|
+
item = {"class" => self, "args" => args}
|
104
211
|
|
105
212
|
# Optimization to enqueue something now that is scheduled to go out now or in the past
|
106
|
-
item
|
213
|
+
item["at"] = ts if ts > now
|
107
214
|
|
108
215
|
client_push(item)
|
109
216
|
end
|
@@ -122,99 +229,16 @@ module Sidekiq
|
|
122
229
|
#
|
123
230
|
# In practice, any option is allowed. This is the main mechanism to configure the
|
124
231
|
# options for a specific job.
|
125
|
-
def sidekiq_options(opts={})
|
126
|
-
|
127
|
-
self.sidekiq_options_hash = get_sidekiq_options.merge(Hash[opts.map{|k, v| [k.to_s, v]}])
|
128
|
-
end
|
129
|
-
|
130
|
-
def sidekiq_retry_in(&block)
|
131
|
-
self.sidekiq_retry_in_block = block
|
132
|
-
end
|
133
|
-
|
134
|
-
def sidekiq_retries_exhausted(&block)
|
135
|
-
self.sidekiq_retries_exhausted_block = block
|
136
|
-
end
|
137
|
-
|
138
|
-
def get_sidekiq_options # :nodoc:
|
139
|
-
self.sidekiq_options_hash ||= Sidekiq.default_worker_options
|
232
|
+
def sidekiq_options(opts = {})
|
233
|
+
super
|
140
234
|
end
|
141
235
|
|
142
236
|
def client_push(item) # :nodoc:
|
143
|
-
pool = Thread.current[:sidekiq_via_pool] || get_sidekiq_options[
|
144
|
-
|
145
|
-
item.keys.each do |key|
|
146
|
-
item[key.to_s] = item.delete(key)
|
147
|
-
end
|
237
|
+
pool = Thread.current[:sidekiq_via_pool] || get_sidekiq_options["pool"] || Sidekiq.redis_pool
|
238
|
+
stringified_item = item.transform_keys(&:to_s)
|
148
239
|
|
149
|
-
Sidekiq::Client.new(pool).push(
|
240
|
+
Sidekiq::Client.new(pool).push(stringified_item)
|
150
241
|
end
|
151
|
-
|
152
|
-
def sidekiq_class_attribute(*attrs)
|
153
|
-
instance_reader = true
|
154
|
-
instance_writer = true
|
155
|
-
|
156
|
-
attrs.each do |name|
|
157
|
-
synchronized_getter = "__synchronized_#{name}"
|
158
|
-
|
159
|
-
singleton_class.instance_eval do
|
160
|
-
undef_method(name) if method_defined?(name) || private_method_defined?(name)
|
161
|
-
end
|
162
|
-
|
163
|
-
define_singleton_method(synchronized_getter) { nil }
|
164
|
-
singleton_class.class_eval do
|
165
|
-
private(synchronized_getter)
|
166
|
-
end
|
167
|
-
|
168
|
-
define_singleton_method(name) { ACCESSOR_MUTEX.synchronize { send synchronized_getter } }
|
169
|
-
|
170
|
-
ivar = "@#{name}"
|
171
|
-
|
172
|
-
singleton_class.instance_eval do
|
173
|
-
m = "#{name}="
|
174
|
-
undef_method(m) if method_defined?(m) || private_method_defined?(m)
|
175
|
-
end
|
176
|
-
define_singleton_method("#{name}=") do |val|
|
177
|
-
singleton_class.class_eval do
|
178
|
-
ACCESSOR_MUTEX.synchronize do
|
179
|
-
undef_method(synchronized_getter) if method_defined?(synchronized_getter) || private_method_defined?(synchronized_getter)
|
180
|
-
define_method(synchronized_getter) { val }
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
if singleton_class?
|
185
|
-
class_eval do
|
186
|
-
undef_method(name) if method_defined?(name) || private_method_defined?(name)
|
187
|
-
define_method(name) do
|
188
|
-
if instance_variable_defined? ivar
|
189
|
-
instance_variable_get ivar
|
190
|
-
else
|
191
|
-
singleton_class.send name
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
195
|
-
end
|
196
|
-
val
|
197
|
-
end
|
198
|
-
|
199
|
-
if instance_reader
|
200
|
-
undef_method(name) if method_defined?(name) || private_method_defined?(name)
|
201
|
-
define_method(name) do
|
202
|
-
if instance_variable_defined?(ivar)
|
203
|
-
instance_variable_get ivar
|
204
|
-
else
|
205
|
-
self.class.public_send name
|
206
|
-
end
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
if instance_writer
|
211
|
-
m = "#{name}="
|
212
|
-
undef_method(m) if method_defined?(m) || private_method_defined?(m)
|
213
|
-
attr_writer name
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
242
|
end
|
219
243
|
end
|
220
244
|
end
|
data/lib/sidekiq.rb
CHANGED
@@ -1,27 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.
|
3
|
+
require "sidekiq/version"
|
4
|
+
fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.5.0." if RUBY_PLATFORM != "java" && Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.5.0")
|
5
5
|
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
6
|
+
require "sidekiq/logger"
|
7
|
+
require "sidekiq/client"
|
8
|
+
require "sidekiq/worker"
|
9
|
+
require "sidekiq/redis_connection"
|
10
|
+
require "sidekiq/delay"
|
11
11
|
|
12
|
-
require
|
12
|
+
require "json"
|
13
13
|
|
14
14
|
module Sidekiq
|
15
|
-
NAME =
|
16
|
-
LICENSE =
|
15
|
+
NAME = "Sidekiq"
|
16
|
+
LICENSE = "See LICENSE and the LGPL-3.0 for licensing details."
|
17
17
|
|
18
18
|
DEFAULTS = {
|
19
19
|
queues: [],
|
20
20
|
labels: [],
|
21
21
|
concurrency: 10,
|
22
|
-
require:
|
22
|
+
require: ".",
|
23
|
+
strict: true,
|
23
24
|
environment: nil,
|
24
|
-
timeout:
|
25
|
+
timeout: 25,
|
25
26
|
poll_interval_average: nil,
|
26
27
|
average_scheduled_poll_interval: 5,
|
27
28
|
error_handlers: [],
|
@@ -30,16 +31,16 @@ module Sidekiq
|
|
30
31
|
startup: [],
|
31
32
|
quiet: [],
|
32
33
|
shutdown: [],
|
33
|
-
heartbeat: []
|
34
|
+
heartbeat: []
|
34
35
|
},
|
35
36
|
dead_max_jobs: 10_000,
|
36
37
|
dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
|
37
|
-
reloader: proc { |&block| block.call }
|
38
|
+
reloader: proc { |&block| block.call }
|
38
39
|
}
|
39
40
|
|
40
41
|
DEFAULT_WORKER_OPTIONS = {
|
41
|
-
|
42
|
-
|
42
|
+
"retry" => true,
|
43
|
+
"queue" => "default"
|
43
44
|
}
|
44
45
|
|
45
46
|
FAKE_INFO = {
|
@@ -95,10 +96,15 @@ module Sidekiq
|
|
95
96
|
retryable = true
|
96
97
|
begin
|
97
98
|
yield conn
|
98
|
-
rescue Redis::
|
99
|
-
#2550 Failover can cause the server to become a replica, need
|
99
|
+
rescue Redis::BaseError => ex
|
100
|
+
# 2550 Failover can cause the server to become a replica, need
|
100
101
|
# to disconnect and reopen the socket to get back to the primary.
|
101
|
-
|
102
|
+
# 4495 Use the same logic if we have a "Not enough replicas" error from the primary
|
103
|
+
if retryable && ex.message =~ /READONLY|NOREPLICAS/
|
104
|
+
conn.disconnect!
|
105
|
+
retryable = false
|
106
|
+
retry
|
107
|
+
end
|
102
108
|
raise
|
103
109
|
end
|
104
110
|
end
|
@@ -106,19 +112,17 @@ module Sidekiq
|
|
106
112
|
|
107
113
|
def self.redis_info
|
108
114
|
redis do |conn|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
conn.info
|
116
|
-
end
|
117
|
-
rescue Redis::CommandError => ex
|
118
|
-
#2850 return fake version when INFO command has (probably) been renamed
|
119
|
-
raise unless ex.message =~ /unknown command/
|
120
|
-
FAKE_INFO
|
115
|
+
# admin commands can't go through redis-namespace starting
|
116
|
+
# in redis-namespace 2.0
|
117
|
+
if conn.respond_to?(:namespace)
|
118
|
+
conn.redis.info
|
119
|
+
else
|
120
|
+
conn.info
|
121
121
|
end
|
122
|
+
rescue Redis::CommandError => ex
|
123
|
+
# 2850 return fake version when INFO command has (probably) been renamed
|
124
|
+
raise unless /unknown command/.match?(ex.message)
|
125
|
+
FAKE_INFO
|
122
126
|
end
|
123
127
|
end
|
124
128
|
|
@@ -152,18 +156,13 @@ module Sidekiq
|
|
152
156
|
|
153
157
|
def self.default_worker_options=(hash)
|
154
158
|
# stringify
|
155
|
-
@default_worker_options = default_worker_options.merge(
|
159
|
+
@default_worker_options = default_worker_options.merge(hash.transform_keys(&:to_s))
|
156
160
|
end
|
161
|
+
|
157
162
|
def self.default_worker_options
|
158
163
|
defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
|
159
164
|
end
|
160
165
|
|
161
|
-
def self.default_retries_exhausted=(prok)
|
162
|
-
logger.info { "default_retries_exhausted is deprecated, please use `config.death_handlers << -> {|job, ex| }`" }
|
163
|
-
return nil unless prok
|
164
|
-
death_handlers << prok
|
165
|
-
end
|
166
|
-
|
167
166
|
##
|
168
167
|
# Death handlers are called when all retries for a job have been exhausted and
|
169
168
|
# the job dies. It's the notification to your application
|
@@ -180,15 +179,41 @@ module Sidekiq
|
|
180
179
|
def self.load_json(string)
|
181
180
|
JSON.parse(string)
|
182
181
|
end
|
182
|
+
|
183
183
|
def self.dump_json(object)
|
184
184
|
JSON.generate(object)
|
185
185
|
end
|
186
186
|
|
187
|
+
def self.log_formatter
|
188
|
+
@log_formatter ||= if ENV["DYNO"]
|
189
|
+
Sidekiq::Logger::Formatters::WithoutTimestamp.new
|
190
|
+
else
|
191
|
+
Sidekiq::Logger::Formatters::Pretty.new
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
def self.log_formatter=(log_formatter)
|
196
|
+
@log_formatter = log_formatter
|
197
|
+
logger.formatter = log_formatter
|
198
|
+
end
|
199
|
+
|
187
200
|
def self.logger
|
188
|
-
Sidekiq::
|
201
|
+
@logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
|
189
202
|
end
|
190
|
-
|
191
|
-
|
203
|
+
|
204
|
+
def self.logger=(logger)
|
205
|
+
if logger.nil?
|
206
|
+
self.logger.level = Logger::FATAL
|
207
|
+
return self.logger
|
208
|
+
end
|
209
|
+
|
210
|
+
logger.extend(Sidekiq::LoggingUtils)
|
211
|
+
|
212
|
+
@logger = logger
|
213
|
+
end
|
214
|
+
|
215
|
+
def self.pro?
|
216
|
+
defined?(Sidekiq::Pro)
|
192
217
|
end
|
193
218
|
|
194
219
|
# How frequently Redis should be checked by a random Sidekiq process for
|
@@ -197,7 +222,7 @@ module Sidekiq
|
|
197
222
|
#
|
198
223
|
# See sidekiq/scheduled.rb for an in-depth explanation of this value
|
199
224
|
def self.average_scheduled_poll_interval=(interval)
|
200
|
-
|
225
|
+
options[:average_scheduled_poll_interval] = interval
|
201
226
|
end
|
202
227
|
|
203
228
|
# Register a proc to handle any error which occurs within the Sidekiq process.
|
@@ -208,7 +233,7 @@ module Sidekiq
|
|
208
233
|
#
|
209
234
|
# The default error handler logs errors to Sidekiq.logger.
|
210
235
|
def self.error_handlers
|
211
|
-
|
236
|
+
options[:error_handlers]
|
212
237
|
end
|
213
238
|
|
214
239
|
# Register a block to run at a point in the Sidekiq lifecycle.
|
@@ -234,4 +259,4 @@ module Sidekiq
|
|
234
259
|
class Shutdown < Interrupt; end
|
235
260
|
end
|
236
261
|
|
237
|
-
require
|
262
|
+
require "sidekiq/rails" if defined?(::Rails::Engine)
|
data/sidekiq.gemspec
CHANGED
@@ -1,21 +1,20 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "lib/sidekiq/version"
|
2
2
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
|
-
gem.authors
|
5
|
-
gem.email
|
6
|
-
gem.summary
|
7
|
-
gem.description
|
8
|
-
gem.homepage
|
9
|
-
gem.license
|
4
|
+
gem.authors = ["Mike Perham"]
|
5
|
+
gem.email = ["mperham@gmail.com"]
|
6
|
+
gem.summary = "Simple, efficient background processing for Ruby"
|
7
|
+
gem.description = "Simple, efficient background processing for Ruby."
|
8
|
+
gem.homepage = "https://sidekiq.org"
|
9
|
+
gem.license = "LGPL-3.0"
|
10
10
|
|
11
|
-
gem.executables
|
12
|
-
gem.files
|
13
|
-
gem.name
|
14
|
-
gem.version
|
15
|
-
gem.required_ruby_version = ">= 2.
|
11
|
+
gem.executables = ["sidekiq", "sidekiqmon"]
|
12
|
+
gem.files = `git ls-files | grep -Ev '^(test|myapp|examples)'`.split("\n")
|
13
|
+
gem.name = "sidekiq"
|
14
|
+
gem.version = Sidekiq::VERSION
|
15
|
+
gem.required_ruby_version = ">= 2.5.0"
|
16
16
|
|
17
|
-
gem.add_dependency
|
18
|
-
gem.add_dependency
|
19
|
-
gem.add_dependency
|
20
|
-
gem.add_dependency 'rack-protection', '>= 1.5.0'
|
17
|
+
gem.add_dependency "redis", ">= 4.2.0"
|
18
|
+
gem.add_dependency "connection_pool", ">= 2.2.2"
|
19
|
+
gem.add_dependency "rack", "~> 2.0"
|
21
20
|
end
|