sidekiq 6.2.2 → 8.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Changes.md +726 -11
- data/LICENSE.txt +9 -0
- data/README.md +70 -39
- data/bin/kiq +17 -0
- data/bin/lint-herb +13 -0
- data/bin/multi_queue_bench +271 -0
- data/bin/sidekiq +4 -9
- data/bin/sidekiqload +214 -115
- data/bin/sidekiqmon +4 -1
- data/bin/webload +69 -0
- data/lib/active_job/queue_adapters/sidekiq_adapter.rb +124 -0
- data/lib/generators/sidekiq/job_generator.rb +71 -0
- data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +3 -3
- data/lib/generators/sidekiq/templates/{worker_spec.rb.erb → job_spec.rb.erb} +1 -1
- data/lib/generators/sidekiq/templates/{worker_test.rb.erb → job_test.rb.erb} +1 -1
- data/lib/sidekiq/api.rb +729 -264
- data/lib/sidekiq/capsule.rb +135 -0
- data/lib/sidekiq/cli.rb +124 -100
- data/lib/sidekiq/client.rb +153 -106
- data/lib/sidekiq/component.rb +132 -0
- data/lib/sidekiq/config.rb +320 -0
- data/lib/sidekiq/deploy.rb +64 -0
- data/lib/sidekiq/embedded.rb +64 -0
- data/lib/sidekiq/fetch.rb +27 -26
- data/lib/sidekiq/iterable_job.rb +56 -0
- data/lib/sidekiq/job/interrupt_handler.rb +24 -0
- data/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
- data/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
- data/lib/sidekiq/job/iterable/enumerators.rb +135 -0
- data/lib/sidekiq/job/iterable.rb +322 -0
- data/lib/sidekiq/job.rb +397 -5
- data/lib/sidekiq/job_logger.rb +23 -32
- data/lib/sidekiq/job_retry.rb +141 -68
- data/lib/sidekiq/job_util.rb +113 -0
- data/lib/sidekiq/launcher.rb +122 -98
- data/lib/sidekiq/loader.rb +57 -0
- data/lib/sidekiq/logger.rb +27 -106
- data/lib/sidekiq/manager.rb +41 -43
- data/lib/sidekiq/metrics/query.rb +184 -0
- data/lib/sidekiq/metrics/shared.rb +109 -0
- data/lib/sidekiq/metrics/tracking.rb +153 -0
- data/lib/sidekiq/middleware/chain.rb +96 -51
- data/lib/sidekiq/middleware/current_attributes.rb +120 -0
- data/lib/sidekiq/middleware/i18n.rb +8 -4
- data/lib/sidekiq/middleware/modules.rb +23 -0
- data/lib/sidekiq/monitor.rb +16 -6
- data/lib/sidekiq/paginator.rb +37 -10
- data/lib/sidekiq/processor.rb +105 -87
- data/lib/sidekiq/profiler.rb +73 -0
- data/lib/sidekiq/rails.rb +49 -36
- data/lib/sidekiq/redis_client_adapter.rb +117 -0
- data/lib/sidekiq/redis_connection.rb +55 -86
- data/lib/sidekiq/ring_buffer.rb +32 -0
- data/lib/sidekiq/scheduled.rb +106 -50
- data/lib/sidekiq/systemd.rb +2 -0
- data/lib/sidekiq/test_api.rb +331 -0
- data/lib/sidekiq/testing/inline.rb +2 -30
- data/lib/sidekiq/testing.rb +2 -342
- data/lib/sidekiq/transaction_aware_client.rb +59 -0
- data/lib/sidekiq/tui/controls.rb +53 -0
- data/lib/sidekiq/tui/filtering.rb +53 -0
- data/lib/sidekiq/tui/tabs/base_tab.rb +204 -0
- data/lib/sidekiq/tui/tabs/busy.rb +118 -0
- data/lib/sidekiq/tui/tabs/dead.rb +19 -0
- data/lib/sidekiq/tui/tabs/home.rb +144 -0
- data/lib/sidekiq/tui/tabs/metrics.rb +131 -0
- data/lib/sidekiq/tui/tabs/queues.rb +95 -0
- data/lib/sidekiq/tui/tabs/retries.rb +19 -0
- data/lib/sidekiq/tui/tabs/scheduled.rb +19 -0
- data/lib/sidekiq/tui/tabs/set_tab.rb +96 -0
- data/lib/sidekiq/tui/tabs.rb +15 -0
- data/lib/sidekiq/tui.rb +382 -0
- data/lib/sidekiq/version.rb +6 -1
- data/lib/sidekiq/web/action.rb +149 -64
- data/lib/sidekiq/web/application.rb +376 -268
- data/lib/sidekiq/web/config.rb +117 -0
- data/lib/sidekiq/web/helpers.rb +213 -87
- data/lib/sidekiq/web/router.rb +61 -74
- data/lib/sidekiq/web.rb +71 -100
- data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
- data/lib/sidekiq.rb +95 -196
- data/sidekiq.gemspec +14 -11
- data/web/assets/images/logo.png +0 -0
- data/web/assets/images/status.png +0 -0
- data/web/assets/javascripts/application.js +171 -57
- data/web/assets/javascripts/base-charts.js +120 -0
- data/web/assets/javascripts/chart.min.js +13 -0
- data/web/assets/javascripts/chartjs-adapter-date-fns.min.js +7 -0
- data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
- data/web/assets/javascripts/dashboard-charts.js +194 -0
- data/web/assets/javascripts/dashboard.js +41 -274
- data/web/assets/javascripts/metrics.js +280 -0
- data/web/assets/stylesheets/style.css +776 -0
- data/web/locales/ar.yml +72 -70
- data/web/locales/cs.yml +64 -62
- data/web/locales/da.yml +62 -53
- data/web/locales/de.yml +67 -65
- data/web/locales/el.yml +45 -24
- data/web/locales/en.yml +93 -69
- data/web/locales/es.yml +91 -68
- data/web/locales/fa.yml +67 -65
- data/web/locales/fr.yml +82 -67
- data/web/locales/gd.yml +110 -0
- data/web/locales/he.yml +67 -64
- data/web/locales/hi.yml +61 -59
- data/web/locales/it.yml +94 -54
- data/web/locales/ja.yml +74 -68
- data/web/locales/ko.yml +54 -52
- data/web/locales/lt.yml +68 -66
- data/web/locales/nb.yml +63 -61
- data/web/locales/nl.yml +54 -52
- data/web/locales/pl.yml +47 -45
- data/web/locales/{pt-br.yml → pt-BR.yml} +85 -56
- data/web/locales/pt.yml +53 -51
- data/web/locales/ru.yml +69 -66
- data/web/locales/sv.yml +55 -53
- data/web/locales/ta.yml +62 -60
- data/web/locales/tr.yml +102 -0
- data/web/locales/uk.yml +87 -61
- data/web/locales/ur.yml +66 -64
- data/web/locales/vi.yml +69 -67
- data/web/locales/zh-CN.yml +107 -0
- data/web/locales/{zh-tw.yml → zh-TW.yml} +44 -9
- data/web/views/_footer.html.erb +32 -0
- data/web/views/_job_info.html.erb +115 -0
- data/web/views/_metrics_period_select.html.erb +15 -0
- data/web/views/_nav.html.erb +45 -0
- data/web/views/_paging.html.erb +26 -0
- data/web/views/_poll_link.html.erb +4 -0
- data/web/views/_summary.html.erb +40 -0
- data/web/views/busy.html.erb +151 -0
- data/web/views/dashboard.html.erb +104 -0
- data/web/views/dead.html.erb +38 -0
- data/web/views/filtering.html.erb +6 -0
- data/web/views/layout.html.erb +26 -0
- data/web/views/metrics.html.erb +85 -0
- data/web/views/metrics_for_job.html.erb +58 -0
- data/web/views/morgue.html.erb +69 -0
- data/web/views/profiles.html.erb +43 -0
- data/web/views/queue.html.erb +57 -0
- data/web/views/queues.html.erb +46 -0
- data/web/views/retries.html.erb +77 -0
- data/web/views/retry.html.erb +39 -0
- data/web/views/scheduled.html.erb +64 -0
- data/web/views/{scheduled_job_info.erb → scheduled_job_info.html.erb} +3 -3
- metadata +130 -61
- data/LICENSE +0 -9
- data/lib/generators/sidekiq/worker_generator.rb +0 -57
- data/lib/sidekiq/delay.rb +0 -41
- data/lib/sidekiq/exception_handler.rb +0 -27
- data/lib/sidekiq/extensions/action_mailer.rb +0 -48
- data/lib/sidekiq/extensions/active_record.rb +0 -43
- data/lib/sidekiq/extensions/class_methods.rb +0 -43
- data/lib/sidekiq/extensions/generic_proxy.rb +0 -33
- data/lib/sidekiq/util.rb +0 -95
- data/lib/sidekiq/web/csrf_protection.rb +0 -180
- data/lib/sidekiq/worker.rb +0 -244
- data/web/assets/stylesheets/application-dark.css +0 -147
- data/web/assets/stylesheets/application-rtl.css +0 -246
- data/web/assets/stylesheets/application.css +0 -1053
- data/web/assets/stylesheets/bootstrap-rtl.min.css +0 -9
- data/web/assets/stylesheets/bootstrap.css +0 -5
- data/web/locales/zh-cn.yml +0 -68
- data/web/views/_footer.erb +0 -20
- data/web/views/_job_info.erb +0 -89
- data/web/views/_nav.erb +0 -52
- data/web/views/_paging.erb +0 -23
- data/web/views/_poll_link.erb +0 -7
- data/web/views/_status.erb +0 -4
- data/web/views/_summary.erb +0 -40
- data/web/views/busy.erb +0 -132
- data/web/views/dashboard.erb +0 -83
- data/web/views/dead.erb +0 -34
- data/web/views/layout.erb +0 -42
- data/web/views/morgue.erb +0 -78
- data/web/views/queue.erb +0 -55
- data/web/views/queues.erb +0 -38
- data/web/views/retries.erb +0 -83
- data/web/views/retry.erb +0 -34
- data/web/views/scheduled.erb +0 -57
data/lib/sidekiq.rb
CHANGED
|
@@ -1,13 +1,41 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "sidekiq/version"
|
|
4
|
-
fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.
|
|
4
|
+
fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 3.2.0." if RUBY_PLATFORM != "java" && Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.2.0")
|
|
5
5
|
|
|
6
|
+
begin
|
|
7
|
+
require "sidekiq-ent/version"
|
|
8
|
+
fail <<~EOM if Gem::Version.new(Sidekiq::Enterprise::VERSION).segments[0] != Sidekiq::MAJOR
|
|
9
|
+
|
|
10
|
+
Sidekiq Enterprise #{Sidekiq::Enterprise::VERSION} does not work with Sidekiq #{Sidekiq::VERSION}.
|
|
11
|
+
Starting with Sidekiq 7, major versions are synchronized so Sidekiq Enterprise 7 works with Sidekiq 7.
|
|
12
|
+
Use `bundle up sidekiq-ent` to upgrade.
|
|
13
|
+
|
|
14
|
+
EOM
|
|
15
|
+
rescue LoadError
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
begin
|
|
19
|
+
require "sidekiq/pro/version"
|
|
20
|
+
fail <<~EOM if Gem::Version.new(Sidekiq::Pro::VERSION).segments[0] != Sidekiq::MAJOR
|
|
21
|
+
|
|
22
|
+
Sidekiq Pro #{Sidekiq::Pro::VERSION} does not work with Sidekiq #{Sidekiq::VERSION}.
|
|
23
|
+
Starting with Sidekiq 7, major versions are synchronized so Sidekiq Pro 7 works with Sidekiq 7.
|
|
24
|
+
Use `bundle up sidekiq-pro` to upgrade.
|
|
25
|
+
|
|
26
|
+
EOM
|
|
27
|
+
rescue LoadError
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
require "sidekiq/config"
|
|
6
31
|
require "sidekiq/logger"
|
|
32
|
+
require "sidekiq/loader"
|
|
7
33
|
require "sidekiq/client"
|
|
8
|
-
require "sidekiq/
|
|
9
|
-
require "sidekiq/
|
|
10
|
-
require "sidekiq/
|
|
34
|
+
require "sidekiq/transaction_aware_client"
|
|
35
|
+
require "sidekiq/job"
|
|
36
|
+
require "sidekiq/iterable_job"
|
|
37
|
+
require "sidekiq/worker_compatibility_alias"
|
|
38
|
+
require "sidekiq/redis_client_adapter"
|
|
11
39
|
|
|
12
40
|
require "json"
|
|
13
41
|
|
|
@@ -15,247 +43,118 @@ module Sidekiq
|
|
|
15
43
|
NAME = "Sidekiq"
|
|
16
44
|
LICENSE = "See LICENSE and the LGPL-3.0 for licensing details."
|
|
17
45
|
|
|
18
|
-
DEFAULTS = {
|
|
19
|
-
queues: [],
|
|
20
|
-
labels: [],
|
|
21
|
-
concurrency: 10,
|
|
22
|
-
require: ".",
|
|
23
|
-
strict: true,
|
|
24
|
-
environment: nil,
|
|
25
|
-
timeout: 25,
|
|
26
|
-
poll_interval_average: nil,
|
|
27
|
-
average_scheduled_poll_interval: 5,
|
|
28
|
-
error_handlers: [],
|
|
29
|
-
death_handlers: [],
|
|
30
|
-
lifecycle_events: {
|
|
31
|
-
startup: [],
|
|
32
|
-
quiet: [],
|
|
33
|
-
shutdown: [],
|
|
34
|
-
heartbeat: []
|
|
35
|
-
},
|
|
36
|
-
dead_max_jobs: 10_000,
|
|
37
|
-
dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
|
|
38
|
-
reloader: proc { |&block| block.call }
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
DEFAULT_WORKER_OPTIONS = {
|
|
42
|
-
"retry" => true,
|
|
43
|
-
"queue" => "default"
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
FAKE_INFO = {
|
|
47
|
-
"redis_version" => "9.9.9",
|
|
48
|
-
"uptime_in_days" => "9999",
|
|
49
|
-
"connected_clients" => "9999",
|
|
50
|
-
"used_memory_human" => "9P",
|
|
51
|
-
"used_memory_peak_human" => "9P"
|
|
52
|
-
}
|
|
53
|
-
|
|
54
46
|
def self.❨╯°□°❩╯︵┻━┻
|
|
55
|
-
puts "
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def self.options
|
|
59
|
-
@options ||= DEFAULTS.dup
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def self.options=(opts)
|
|
63
|
-
@options = opts
|
|
47
|
+
puts "Take a deep breath and count to ten..."
|
|
64
48
|
end
|
|
65
49
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
#
|
|
69
|
-
# Sidekiq.configure_server do |config|
|
|
70
|
-
# config.redis = { :namespace => 'myapp', :size => 25, :url => 'redis://myhost:8877/0' }
|
|
71
|
-
# config.server_middleware do |chain|
|
|
72
|
-
# chain.add MyServerHook
|
|
73
|
-
# end
|
|
74
|
-
# end
|
|
75
|
-
def self.configure_server
|
|
76
|
-
yield self if server?
|
|
77
|
-
end
|
|
50
|
+
def self.testing!(mode = :fake, &block)
|
|
51
|
+
raise "Unknown testing mode: #{mode}" unless %i[fake disable inline].include?(mode)
|
|
78
52
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
#
|
|
82
|
-
# Sidekiq.configure_client do |config|
|
|
83
|
-
# config.redis = { :namespace => 'myapp', :size => 1, :url => 'redis://myhost:8877/0' }
|
|
84
|
-
# end
|
|
85
|
-
def self.configure_client
|
|
86
|
-
yield self unless server?
|
|
53
|
+
require "sidekiq/test_api"
|
|
54
|
+
Sidekiq::Testing.__set_test_mode(mode, &block)
|
|
87
55
|
end
|
|
88
56
|
|
|
89
57
|
def self.server?
|
|
90
58
|
defined?(Sidekiq::CLI)
|
|
91
59
|
end
|
|
92
60
|
|
|
93
|
-
def self.
|
|
94
|
-
|
|
95
|
-
redis_pool.with do |conn|
|
|
96
|
-
retryable = true
|
|
97
|
-
begin
|
|
98
|
-
yield conn
|
|
99
|
-
rescue Redis::BaseError => ex
|
|
100
|
-
# 2550 Failover can cause the server to become a replica, need
|
|
101
|
-
# to disconnect and reopen the socket to get back to the primary.
|
|
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
|
|
108
|
-
raise
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def self.redis_info
|
|
114
|
-
redis do |conn|
|
|
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
|
-
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
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
def self.redis_pool
|
|
130
|
-
@redis ||= Sidekiq::RedisConnection.create
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
def self.redis=(hash)
|
|
134
|
-
@redis = if hash.is_a?(ConnectionPool)
|
|
135
|
-
hash
|
|
136
|
-
else
|
|
137
|
-
Sidekiq::RedisConnection.create(hash)
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
def self.client_middleware
|
|
142
|
-
@client_chain ||= Middleware::Chain.new
|
|
143
|
-
yield @client_chain if block_given?
|
|
144
|
-
@client_chain
|
|
61
|
+
def self.load_json(string)
|
|
62
|
+
JSON.parse(string)
|
|
145
63
|
end
|
|
146
64
|
|
|
147
|
-
def self.
|
|
148
|
-
|
|
149
|
-
yield @server_chain if block_given?
|
|
150
|
-
@server_chain
|
|
65
|
+
def self.dump_json(object)
|
|
66
|
+
JSON.generate(object)
|
|
151
67
|
end
|
|
152
68
|
|
|
153
|
-
def self.
|
|
154
|
-
|
|
69
|
+
def self.pro?
|
|
70
|
+
defined?(Sidekiq::Pro)
|
|
155
71
|
end
|
|
156
72
|
|
|
157
|
-
def self.
|
|
158
|
-
|
|
159
|
-
@default_worker_options = default_worker_options.merge(hash.transform_keys(&:to_s))
|
|
73
|
+
def self.ent?
|
|
74
|
+
defined?(Sidekiq::Enterprise)
|
|
160
75
|
end
|
|
161
76
|
|
|
162
|
-
def self.
|
|
163
|
-
|
|
77
|
+
def self.redis_pool
|
|
78
|
+
(Thread.current[:sidekiq_capsule] || default_configuration).redis_pool
|
|
164
79
|
end
|
|
165
80
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
# the job dies. It's the notification to your application
|
|
169
|
-
# that this job will not succeed without manual intervention.
|
|
170
|
-
#
|
|
171
|
-
# Sidekiq.configure_server do |config|
|
|
172
|
-
# config.death_handlers << ->(job, ex) do
|
|
173
|
-
# end
|
|
174
|
-
# end
|
|
175
|
-
def self.death_handlers
|
|
176
|
-
options[:death_handlers]
|
|
81
|
+
def self.redis(&block)
|
|
82
|
+
(Thread.current[:sidekiq_capsule] || default_configuration).redis(&block)
|
|
177
83
|
end
|
|
178
84
|
|
|
179
|
-
def self.
|
|
180
|
-
|
|
85
|
+
def self.strict_args!(mode = :raise)
|
|
86
|
+
Sidekiq::Config::DEFAULTS[:on_complex_arguments] = mode
|
|
181
87
|
end
|
|
182
88
|
|
|
183
|
-
def self.
|
|
184
|
-
|
|
89
|
+
def self.default_job_options=(hash)
|
|
90
|
+
@default_job_options = default_job_options.merge(hash.transform_keys(&:to_s))
|
|
185
91
|
end
|
|
186
92
|
|
|
187
|
-
def self.
|
|
188
|
-
@
|
|
189
|
-
Sidekiq::Logger::Formatters::WithoutTimestamp.new
|
|
190
|
-
else
|
|
191
|
-
Sidekiq::Logger::Formatters::Pretty.new
|
|
192
|
-
end
|
|
93
|
+
def self.default_job_options
|
|
94
|
+
@default_job_options ||= {"retry" => true, "queue" => "default"}
|
|
193
95
|
end
|
|
194
96
|
|
|
195
|
-
def self.
|
|
196
|
-
@
|
|
197
|
-
logger.formatter = log_formatter
|
|
97
|
+
def self.default_configuration
|
|
98
|
+
@config ||= Sidekiq::Config.new
|
|
198
99
|
end
|
|
199
100
|
|
|
200
101
|
def self.logger
|
|
201
|
-
|
|
102
|
+
default_configuration.logger
|
|
202
103
|
end
|
|
203
104
|
|
|
204
|
-
def self.
|
|
205
|
-
|
|
206
|
-
self.logger.level = Logger::FATAL
|
|
207
|
-
return self.logger
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
logger.extend(Sidekiq::LoggingUtils)
|
|
211
|
-
|
|
212
|
-
@logger = logger
|
|
105
|
+
def self.loader
|
|
106
|
+
@loader ||= Loader.new
|
|
213
107
|
end
|
|
214
108
|
|
|
215
|
-
def self.
|
|
216
|
-
|
|
109
|
+
def self.configure_server(&block)
|
|
110
|
+
(@config_blocks ||= []) << block
|
|
111
|
+
yield default_configuration if server?
|
|
217
112
|
end
|
|
218
113
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
# See sidekiq/scheduled.rb for an in-depth explanation of this value
|
|
224
|
-
def self.average_scheduled_poll_interval=(interval)
|
|
225
|
-
options[:average_scheduled_poll_interval] = interval
|
|
114
|
+
def self.freeze!
|
|
115
|
+
@frozen = true
|
|
116
|
+
@config_blocks = nil
|
|
117
|
+
default_configuration.freeze!
|
|
226
118
|
end
|
|
227
119
|
|
|
228
|
-
#
|
|
120
|
+
# Creates a Sidekiq::Config instance that is more tuned for embedding
|
|
121
|
+
# within an arbitrary Ruby process. Notably it reduces concurrency by
|
|
122
|
+
# default so there is less contention for CPU time with other threads.
|
|
229
123
|
#
|
|
230
|
-
# Sidekiq.
|
|
231
|
-
# config.
|
|
124
|
+
# instance = Sidekiq.configure_embed do |config|
|
|
125
|
+
# config.queues = %w[critical default low]
|
|
232
126
|
# end
|
|
127
|
+
# instance.run
|
|
128
|
+
# sleep 10
|
|
129
|
+
# instance.stop
|
|
233
130
|
#
|
|
234
|
-
#
|
|
235
|
-
|
|
236
|
-
|
|
131
|
+
# NB: it is really easy to overload a Ruby process with threads due to the GIL.
|
|
132
|
+
# I do not recommend setting concurrency higher than 2-3.
|
|
133
|
+
#
|
|
134
|
+
# NB: Sidekiq only supports one instance in memory. You will get undefined behavior
|
|
135
|
+
# if you try to embed Sidekiq twice in the same process.
|
|
136
|
+
def self.configure_embed(&block)
|
|
137
|
+
raise "Sidekiq global configuration is frozen, you must create all embedded instances BEFORE calling `run`" if @frozen
|
|
138
|
+
|
|
139
|
+
require "sidekiq/embedded"
|
|
140
|
+
cfg = default_configuration
|
|
141
|
+
cfg.concurrency = 2
|
|
142
|
+
@config_blocks&.each { |block| block.call(cfg) }
|
|
143
|
+
yield cfg
|
|
144
|
+
|
|
145
|
+
Sidekiq::Embedded.new(cfg)
|
|
237
146
|
end
|
|
238
147
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
#
|
|
242
|
-
# Sidekiq.configure_server do |config|
|
|
243
|
-
# config.on(:shutdown) do
|
|
244
|
-
# puts "Goodbye cruel world!"
|
|
245
|
-
# end
|
|
246
|
-
# end
|
|
247
|
-
def self.on(event, &block)
|
|
248
|
-
raise ArgumentError, "Symbols only please: #{event}" unless event.is_a?(Symbol)
|
|
249
|
-
raise ArgumentError, "Invalid event name: #{event}" unless options[:lifecycle_events].key?(event)
|
|
250
|
-
options[:lifecycle_events][event] << block
|
|
148
|
+
def self.configure_client
|
|
149
|
+
yield default_configuration unless server?
|
|
251
150
|
end
|
|
252
151
|
|
|
253
|
-
# We are shutting down Sidekiq but what about
|
|
152
|
+
# We are shutting down Sidekiq but what about threads that
|
|
254
153
|
# are working on some long job? This error is
|
|
255
|
-
# raised in
|
|
154
|
+
# raised in jobs that have not finished within the hard
|
|
256
155
|
# timeout limit. This is needed to rollback db transactions,
|
|
257
156
|
# otherwise Ruby's Thread#kill will commit. See #377.
|
|
258
|
-
# DO NOT RESCUE THIS ERROR IN YOUR
|
|
157
|
+
# DO NOT RESCUE THIS ERROR IN YOUR JOBS
|
|
259
158
|
class Shutdown < Interrupt; end
|
|
260
159
|
end
|
|
261
160
|
|
data/sidekiq.gemspec
CHANGED
|
@@ -2,27 +2,30 @@ require_relative "lib/sidekiq/version"
|
|
|
2
2
|
|
|
3
3
|
Gem::Specification.new do |gem|
|
|
4
4
|
gem.authors = ["Mike Perham"]
|
|
5
|
-
gem.email = ["
|
|
5
|
+
gem.email = ["info@contribsys.com"]
|
|
6
6
|
gem.summary = "Simple, efficient background processing for Ruby"
|
|
7
7
|
gem.description = "Simple, efficient background processing for Ruby."
|
|
8
8
|
gem.homepage = "https://sidekiq.org"
|
|
9
9
|
gem.license = "LGPL-3.0"
|
|
10
10
|
|
|
11
|
-
gem.executables = ["sidekiq", "sidekiqmon"]
|
|
12
|
-
gem.files = [
|
|
11
|
+
gem.executables = ["sidekiq", "sidekiqmon", "kiq"]
|
|
12
|
+
gem.files = %w[sidekiq.gemspec README.md Changes.md LICENSE.txt] + `git ls-files | grep -E '^(bin|lib|web)'`.split("\n")
|
|
13
13
|
gem.name = "sidekiq"
|
|
14
14
|
gem.version = Sidekiq::VERSION
|
|
15
|
-
gem.required_ruby_version = ">= 2.
|
|
15
|
+
gem.required_ruby_version = ">= 3.2.0"
|
|
16
16
|
|
|
17
17
|
gem.metadata = {
|
|
18
18
|
"homepage_uri" => "https://sidekiq.org",
|
|
19
|
-
"bug_tracker_uri" => "https://github.com/
|
|
20
|
-
"documentation_uri" => "https://github.com/
|
|
21
|
-
"changelog_uri" => "https://github.com/
|
|
22
|
-
"source_code_uri" => "https://github.com/
|
|
19
|
+
"bug_tracker_uri" => "https://github.com/sidekiq/sidekiq/issues",
|
|
20
|
+
"documentation_uri" => "https://github.com/sidekiq/sidekiq/wiki",
|
|
21
|
+
"changelog_uri" => "https://github.com/sidekiq/sidekiq/blob/main/Changes.md",
|
|
22
|
+
"source_code_uri" => "https://github.com/sidekiq/sidekiq",
|
|
23
|
+
"rubygems_mfa_required" => "true"
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
gem.add_dependency "redis", ">=
|
|
26
|
-
gem.add_dependency "connection_pool", ">=
|
|
27
|
-
gem.add_dependency "rack", "
|
|
26
|
+
gem.add_dependency "redis-client", ">= 0.29.0"
|
|
27
|
+
gem.add_dependency "connection_pool", ">= 3.0.0"
|
|
28
|
+
gem.add_dependency "rack", ">= 3.2.0"
|
|
29
|
+
gem.add_dependency "json", ">= 2.16.0"
|
|
30
|
+
gem.add_dependency "logger", ">= 1.7.0"
|
|
28
31
|
end
|
data/web/assets/images/logo.png
CHANGED
|
File without changes
|
|
File without changes
|