sidekiq 4.1.4 → 6.5.6

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.

Files changed (213) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +666 -0
  3. data/LICENSE +3 -3
  4. data/README.md +27 -35
  5. data/bin/sidekiq +27 -3
  6. data/bin/sidekiqload +78 -84
  7. data/bin/sidekiqmon +8 -0
  8. data/lib/generators/sidekiq/job_generator.rb +57 -0
  9. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  10. data/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
  11. data/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
  12. data/lib/sidekiq/api.rb +583 -288
  13. data/lib/sidekiq/cli.rb +255 -218
  14. data/lib/sidekiq/client.rb +86 -83
  15. data/lib/sidekiq/component.rb +65 -0
  16. data/lib/sidekiq/delay.rb +43 -0
  17. data/lib/sidekiq/extensions/action_mailer.rb +13 -22
  18. data/lib/sidekiq/extensions/active_record.rb +13 -10
  19. data/lib/sidekiq/extensions/class_methods.rb +14 -11
  20. data/lib/sidekiq/extensions/generic_proxy.rb +13 -5
  21. data/lib/sidekiq/fetch.rb +50 -40
  22. data/lib/sidekiq/job.rb +13 -0
  23. data/lib/sidekiq/job_logger.rb +51 -0
  24. data/lib/sidekiq/job_retry.rb +282 -0
  25. data/lib/sidekiq/job_util.rb +71 -0
  26. data/lib/sidekiq/launcher.rb +192 -85
  27. data/lib/sidekiq/logger.rb +156 -0
  28. data/lib/sidekiq/manager.rb +44 -45
  29. data/lib/sidekiq/metrics/deploy.rb +47 -0
  30. data/lib/sidekiq/metrics/query.rb +153 -0
  31. data/lib/sidekiq/metrics/shared.rb +94 -0
  32. data/lib/sidekiq/metrics/tracking.rb +134 -0
  33. data/lib/sidekiq/middleware/chain.rb +102 -46
  34. data/lib/sidekiq/middleware/current_attributes.rb +63 -0
  35. data/lib/sidekiq/middleware/i18n.rb +7 -7
  36. data/lib/sidekiq/middleware/modules.rb +21 -0
  37. data/lib/sidekiq/monitor.rb +133 -0
  38. data/lib/sidekiq/paginator.rb +20 -16
  39. data/lib/sidekiq/processor.rb +178 -78
  40. data/lib/sidekiq/rails.rb +56 -27
  41. data/lib/sidekiq/redis_client_adapter.rb +154 -0
  42. data/lib/sidekiq/redis_connection.rb +123 -47
  43. data/lib/sidekiq/ring_buffer.rb +29 -0
  44. data/lib/sidekiq/scheduled.rb +97 -40
  45. data/lib/sidekiq/sd_notify.rb +149 -0
  46. data/lib/sidekiq/systemd.rb +24 -0
  47. data/lib/sidekiq/testing/inline.rb +6 -5
  48. data/lib/sidekiq/testing.rb +83 -56
  49. data/lib/sidekiq/transaction_aware_client.rb +45 -0
  50. data/lib/sidekiq/version.rb +2 -1
  51. data/lib/sidekiq/web/action.rb +93 -0
  52. data/lib/sidekiq/web/application.rb +379 -0
  53. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  54. data/lib/sidekiq/web/helpers.rb +365 -0
  55. data/lib/sidekiq/web/router.rb +104 -0
  56. data/lib/sidekiq/web.rb +108 -213
  57. data/lib/sidekiq/worker.rb +288 -42
  58. data/lib/sidekiq.rb +188 -80
  59. data/sidekiq.gemspec +24 -22
  60. data/web/assets/images/apple-touch-icon.png +0 -0
  61. data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
  62. data/web/assets/javascripts/application.js +130 -75
  63. data/web/assets/javascripts/chart.min.js +13 -0
  64. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  65. data/web/assets/javascripts/dashboard.js +70 -91
  66. data/web/assets/javascripts/graph.js +16 -0
  67. data/web/assets/javascripts/metrics.js +262 -0
  68. data/web/assets/stylesheets/application-dark.css +143 -0
  69. data/web/assets/stylesheets/application-rtl.css +242 -0
  70. data/web/assets/stylesheets/application.css +390 -145
  71. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  72. data/web/assets/stylesheets/bootstrap.css +4 -8
  73. data/web/locales/ar.yml +87 -0
  74. data/web/locales/de.yml +15 -3
  75. data/web/locales/el.yml +43 -19
  76. data/web/locales/en.yml +15 -1
  77. data/web/locales/es.yml +22 -5
  78. data/web/locales/fa.yml +80 -0
  79. data/web/locales/fr.yml +10 -3
  80. data/web/locales/he.yml +79 -0
  81. data/web/locales/ja.yml +12 -4
  82. data/web/locales/lt.yml +83 -0
  83. data/web/locales/pl.yml +4 -4
  84. data/web/locales/pt-br.yml +27 -9
  85. data/web/locales/ru.yml +4 -0
  86. data/web/locales/ur.yml +80 -0
  87. data/web/locales/vi.yml +83 -0
  88. data/web/views/_footer.erb +6 -3
  89. data/web/views/_job_info.erb +4 -3
  90. data/web/views/_nav.erb +5 -19
  91. data/web/views/_paging.erb +1 -1
  92. data/web/views/_poll_link.erb +2 -5
  93. data/web/views/_summary.erb +7 -7
  94. data/web/views/busy.erb +64 -26
  95. data/web/views/dashboard.erb +26 -17
  96. data/web/views/dead.erb +4 -4
  97. data/web/views/layout.erb +15 -5
  98. data/web/views/metrics.erb +69 -0
  99. data/web/views/metrics_for_job.erb +87 -0
  100. data/web/views/morgue.erb +21 -14
  101. data/web/views/queue.erb +28 -14
  102. data/web/views/queues.erb +15 -5
  103. data/web/views/retries.erb +24 -15
  104. data/web/views/retry.erb +5 -5
  105. data/web/views/scheduled.erb +9 -6
  106. data/web/views/scheduled_job_info.erb +1 -1
  107. metadata +73 -256
  108. data/.github/contributing.md +0 -32
  109. data/.github/issue_template.md +0 -4
  110. data/.gitignore +0 -12
  111. data/.travis.yml +0 -18
  112. data/3.0-Upgrade.md +0 -70
  113. data/4.0-Upgrade.md +0 -53
  114. data/COMM-LICENSE +0 -95
  115. data/Ent-Changes.md +0 -123
  116. data/Gemfile +0 -29
  117. data/Pro-2.0-Upgrade.md +0 -138
  118. data/Pro-3.0-Upgrade.md +0 -44
  119. data/Pro-Changes.md +0 -559
  120. data/Rakefile +0 -9
  121. data/bin/sidekiqctl +0 -99
  122. data/code_of_conduct.md +0 -50
  123. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +0 -6
  124. data/lib/generators/sidekiq/templates/worker_test.rb.erb +0 -8
  125. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  126. data/lib/sidekiq/core_ext.rb +0 -106
  127. data/lib/sidekiq/exception_handler.rb +0 -31
  128. data/lib/sidekiq/logging.rb +0 -106
  129. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  130. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  131. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -205
  132. data/lib/sidekiq/util.rb +0 -62
  133. data/lib/sidekiq/web_helpers.rb +0 -255
  134. data/test/config.yml +0 -9
  135. data/test/env_based_config.yml +0 -11
  136. data/test/fake_env.rb +0 -1
  137. data/test/fixtures/en.yml +0 -2
  138. data/test/helper.rb +0 -75
  139. data/test/test_actors.rb +0 -138
  140. data/test/test_api.rb +0 -528
  141. data/test/test_cli.rb +0 -406
  142. data/test/test_client.rb +0 -266
  143. data/test/test_exception_handler.rb +0 -56
  144. data/test/test_extensions.rb +0 -127
  145. data/test/test_fetch.rb +0 -50
  146. data/test/test_launcher.rb +0 -85
  147. data/test/test_logging.rb +0 -35
  148. data/test/test_manager.rb +0 -50
  149. data/test/test_middleware.rb +0 -158
  150. data/test/test_processor.rb +0 -201
  151. data/test/test_rails.rb +0 -22
  152. data/test/test_redis_connection.rb +0 -132
  153. data/test/test_retry.rb +0 -326
  154. data/test/test_retry_exhausted.rb +0 -149
  155. data/test/test_scheduled.rb +0 -115
  156. data/test/test_scheduling.rb +0 -50
  157. data/test/test_sidekiq.rb +0 -107
  158. data/test/test_testing.rb +0 -143
  159. data/test/test_testing_fake.rb +0 -357
  160. data/test/test_testing_inline.rb +0 -94
  161. data/test/test_util.rb +0 -13
  162. data/test/test_web.rb +0 -614
  163. data/test/test_web_helpers.rb +0 -54
  164. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  165. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  166. data/web/assets/images/status/active.png +0 -0
  167. data/web/assets/images/status/idle.png +0 -0
  168. data/web/assets/javascripts/locales/README.md +0 -27
  169. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  170. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  171. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  172. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  173. data/web/assets/javascripts/locales/jquery.timeago.cs.js +0 -18
  174. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  175. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  176. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  177. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  178. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  179. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  180. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  181. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  182. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  183. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  184. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  185. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  186. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  187. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  188. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  189. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  190. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  191. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  192. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  193. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  194. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  195. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  196. data/web/assets/javascripts/locales/jquery.timeago.nb.js +0 -18
  197. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  198. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  199. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  200. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  201. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  202. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  203. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  204. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  205. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  206. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  207. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  208. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  209. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  210. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  211. data/web/assets/javascripts/locales/jquery.timeago.zh-cn.js +0 -20
  212. data/web/assets/javascripts/locales/jquery.timeago.zh-tw.js +0 -20
  213. data/web/views/_poll_js.erb +0 -5
data/lib/sidekiq.rb CHANGED
@@ -1,41 +1,47 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
3
- require 'sidekiq/version'
4
- fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.0.0." if RUBY_PLATFORM != 'java' && RUBY_VERSION < '2.0.0'
5
2
 
6
- require 'sidekiq/logging'
7
- require 'sidekiq/client'
8
- require 'sidekiq/worker'
9
- require 'sidekiq/redis_connection'
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")
10
5
 
11
- require 'json'
6
+ require "sidekiq/logger"
7
+ require "sidekiq/client"
8
+ require "sidekiq/transaction_aware_client"
9
+ require "sidekiq/worker"
10
+ require "sidekiq/job"
11
+ require "sidekiq/redis_connection"
12
+ require "sidekiq/delay"
13
+
14
+ require "json"
12
15
 
13
16
  module Sidekiq
14
- NAME = 'Sidekiq'
15
- LICENSE = 'See LICENSE and the LGPL-3.0 for licensing details.'
17
+ NAME = "Sidekiq"
18
+ LICENSE = "See LICENSE and the LGPL-3.0 for licensing details."
16
19
 
17
20
  DEFAULTS = {
18
21
  queues: [],
19
22
  labels: [],
20
- concurrency: 25,
21
- require: '.',
23
+ concurrency: 10,
24
+ require: ".",
25
+ strict: true,
22
26
  environment: nil,
23
- timeout: 8,
27
+ timeout: 25,
24
28
  poll_interval_average: nil,
25
- average_scheduled_poll_interval: 15,
29
+ average_scheduled_poll_interval: 5,
30
+ on_complex_arguments: :warn,
26
31
  error_handlers: [],
32
+ death_handlers: [],
27
33
  lifecycle_events: {
28
34
  startup: [],
29
35
  quiet: [],
30
36
  shutdown: [],
37
+ # triggers when we fire the first heartbeat on startup OR repairing a network partition
38
+ heartbeat: [],
39
+ # triggers on EVERY heartbeat call, every 10 seconds
40
+ beat: []
31
41
  },
32
42
  dead_max_jobs: 10_000,
33
- dead_timeout_in_seconds: 180 * 24 * 60 * 60 # 6 months
34
- }
35
-
36
- DEFAULT_WORKER_OPTIONS = {
37
- 'retry' => true,
38
- 'queue' => 'default'
43
+ dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
44
+ reloader: proc { |&block| block.call }
39
45
  }
40
46
 
41
47
  FAKE_INFO = {
@@ -44,24 +50,90 @@ module Sidekiq
44
50
  "connected_clients" => "9999",
45
51
  "used_memory_human" => "9P",
46
52
  "used_memory_peak_human" => "9P"
47
- }.freeze
53
+ }
48
54
 
49
55
  def self.❨╯°□°❩╯︵┻━┻
50
56
  puts "Calm down, yo."
51
57
  end
52
58
 
59
+ # config.concurrency = 5
60
+ def self.concurrency=(val)
61
+ self[:concurrency] = Integer(val)
62
+ end
63
+
64
+ # config.queues = %w( high default low ) # strict
65
+ # config.queues = %w( high,3 default,2 low,1 ) # weighted
66
+ # config.queues = %w( feature1,1 feature2,1 feature3,1 ) # random
67
+ #
68
+ # With weighted priority, queue will be checked first (weight / total) of the time.
69
+ # high will be checked first (3/6) or 50% of the time.
70
+ # I'd recommend setting weights between 1-10. Weights in the hundreds or thousands
71
+ # are ridiculous and unnecessarily expensive. You can get random queue ordering
72
+ # by explicitly setting all weights to 1.
73
+ def self.queues=(val)
74
+ self[:queues] = Array(val).each_with_object([]) do |qstr, memo|
75
+ name, weight = qstr.split(",")
76
+ self[:strict] = false if weight.to_i > 0
77
+ [weight.to_i, 1].max.times do
78
+ memo << name
79
+ end
80
+ end
81
+ end
82
+
83
+ ### Private APIs
84
+ def self.default_error_handler(ex, ctx)
85
+ logger.warn(dump_json(ctx)) unless ctx.empty?
86
+ logger.warn("#{ex.class.name}: #{ex.message}")
87
+ logger.warn(ex.backtrace.join("\n")) unless ex.backtrace.nil?
88
+ end
89
+
90
+ # DEFAULT_ERROR_HANDLER is a constant that allows the default error handler to
91
+ # be referenced. It must be defined here, after the default_error_handler
92
+ # method is defined.
93
+ DEFAULT_ERROR_HANDLER = method(:default_error_handler)
94
+
95
+ @config = DEFAULTS.dup
53
96
  def self.options
54
- @options ||= DEFAULTS.dup
97
+ logger.warn "`config.options[:key] = value` is deprecated, use `config[:key] = value`: #{caller(1..2)}"
98
+ @config
55
99
  end
100
+
56
101
  def self.options=(opts)
57
- @options = opts
102
+ logger.warn "config.options = hash` is deprecated, use `config.merge!(hash)`: #{caller(1..2)}"
103
+ @config = opts
58
104
  end
59
105
 
106
+ def self.[](key)
107
+ @config[key]
108
+ end
109
+
110
+ def self.[]=(key, val)
111
+ @config[key] = val
112
+ end
113
+
114
+ def self.merge!(hash)
115
+ @config.merge!(hash)
116
+ end
117
+
118
+ def self.fetch(*args, &block)
119
+ @config.fetch(*args, &block)
120
+ end
121
+
122
+ def self.handle_exception(ex, ctx = {})
123
+ self[:error_handlers].each do |handler|
124
+ handler.call(ex, ctx)
125
+ rescue => ex
126
+ logger.error "!!! ERROR HANDLER THREW AN ERROR !!!"
127
+ logger.error ex
128
+ logger.error ex.backtrace.join("\n") unless ex.backtrace.nil?
129
+ end
130
+ end
131
+ ###
132
+
60
133
  ##
61
134
  # Configuration for Sidekiq server, use like:
62
135
  #
63
136
  # Sidekiq.configure_server do |config|
64
- # config.redis = { :namespace => 'myapp', :size => 25, :url => 'redis://myhost:8877/0' }
65
137
  # config.server_middleware do |chain|
66
138
  # chain.add MyServerHook
67
139
  # end
@@ -74,7 +146,7 @@ module Sidekiq
74
146
  # Configuration for Sidekiq client, use like:
75
147
  #
76
148
  # Sidekiq.configure_client do |config|
77
- # config.redis = { :namespace => 'myapp', :size => 1, :url => 'redis://myhost:8877/0' }
149
+ # config.redis = { size: 1, url: 'redis://myhost:8877/0' }
78
150
  # end
79
151
  def self.configure_client
80
152
  yield self unless server?
@@ -90,10 +162,17 @@ module Sidekiq
90
162
  retryable = true
91
163
  begin
92
164
  yield conn
93
- rescue Redis::CommandError => ex
94
- #2550 Failover can cause the server to become a slave, need
95
- # to disconnect and reopen the socket to get back to the master.
96
- (conn.disconnect!; retryable = false; retry) if retryable && ex.message =~ /READONLY/
165
+ rescue RedisConnection.adapter::BaseError => ex
166
+ # 2550 Failover can cause the server to become a replica, need
167
+ # to disconnect and reopen the socket to get back to the primary.
168
+ # 4495 Use the same logic if we have a "Not enough replicas" error from the primary
169
+ # 4985 Use the same logic when a blocking command is force-unblocked
170
+ # The same retry logic is also used in client.rb
171
+ if retryable && ex.message =~ /READONLY|NOREPLICAS|UNBLOCKED/
172
+ conn.disconnect!
173
+ retryable = false
174
+ retry
175
+ end
97
176
  raise
98
177
  end
99
178
  end
@@ -101,36 +180,34 @@ module Sidekiq
101
180
 
102
181
  def self.redis_info
103
182
  redis do |conn|
104
- begin
105
- # admin commands can't go through redis-namespace starting
106
- # in redis-namespace 2.0
107
- if conn.respond_to?(:namespace)
108
- conn.redis.info
109
- else
110
- conn.info
111
- end
112
- rescue Redis::CommandError => ex
113
- #2850 return fake version when INFO command has (probably) been renamed
114
- raise unless ex.message =~ /unknown command/
115
- FAKE_INFO
183
+ # admin commands can't go through redis-namespace starting
184
+ # in redis-namespace 2.0
185
+ if conn.respond_to?(:namespace)
186
+ conn.redis.info
187
+ else
188
+ conn.info
116
189
  end
190
+ rescue RedisConnection.adapter::CommandError => ex
191
+ # 2850 return fake version when INFO command has (probably) been renamed
192
+ raise unless /unknown command/.match?(ex.message)
193
+ FAKE_INFO
117
194
  end
118
195
  end
119
196
 
120
197
  def self.redis_pool
121
- @redis ||= Sidekiq::RedisConnection.create
198
+ @redis ||= RedisConnection.create
122
199
  end
123
200
 
124
201
  def self.redis=(hash)
125
202
  @redis = if hash.is_a?(ConnectionPool)
126
203
  hash
127
204
  else
128
- Sidekiq::RedisConnection.create(hash)
205
+ RedisConnection.create(hash)
129
206
  end
130
207
  end
131
208
 
132
209
  def self.client_middleware
133
- @client_chain ||= Middleware::Chain.new
210
+ @client_chain ||= Middleware::Chain.new(self)
134
211
  yield @client_chain if block_given?
135
212
  @client_chain
136
213
  end
@@ -142,49 +219,80 @@ module Sidekiq
142
219
  end
143
220
 
144
221
  def self.default_server_middleware
145
- require 'sidekiq/middleware/server/retry_jobs'
146
- require 'sidekiq/middleware/server/logging'
147
-
148
- Middleware::Chain.new do |m|
149
- m.add Middleware::Server::Logging
150
- m.add Middleware::Server::RetryJobs
151
- if defined?(::ActiveRecord::Base)
152
- require 'sidekiq/middleware/server/active_record'
153
- m.add Sidekiq::Middleware::Server::ActiveRecord
154
- end
155
- end
222
+ Middleware::Chain.new(self)
223
+ end
224
+
225
+ def self.default_worker_options=(hash) # deprecated
226
+ @default_job_options = default_job_options.merge(hash.transform_keys(&:to_s))
156
227
  end
157
228
 
158
- def self.default_worker_options=(hash)
159
- @default_worker_options = default_worker_options.merge(hash.stringify_keys)
229
+ def self.default_job_options=(hash)
230
+ @default_job_options = default_job_options.merge(hash.transform_keys(&:to_s))
160
231
  end
161
- def self.default_worker_options
162
- defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
232
+
233
+ def self.default_worker_options # deprecated
234
+ @default_job_options ||= {"retry" => true, "queue" => "default"}
235
+ end
236
+
237
+ def self.default_job_options
238
+ @default_job_options ||= {"retry" => true, "queue" => "default"}
163
239
  end
164
240
 
241
+ ##
242
+ # Death handlers are called when all retries for a job have been exhausted and
243
+ # the job dies. It's the notification to your application
244
+ # that this job will not succeed without manual intervention.
245
+ #
165
246
  # Sidekiq.configure_server do |config|
166
- # config.default_retries_exhausted = -> (job, ex) do
247
+ # config.death_handlers << ->(job, ex) do
167
248
  # end
168
249
  # end
169
- def self.default_retries_exhausted=(prok)
170
- @default_retries_exhausted = prok
171
- end
172
- def self.default_retries_exhausted
173
- @default_retries_exhausted
250
+ def self.death_handlers
251
+ self[:death_handlers]
174
252
  end
175
253
 
176
254
  def self.load_json(string)
177
255
  JSON.parse(string)
178
256
  end
257
+
179
258
  def self.dump_json(object)
180
259
  JSON.generate(object)
181
260
  end
182
261
 
262
+ def self.log_formatter
263
+ @log_formatter ||= if ENV["DYNO"]
264
+ Sidekiq::Logger::Formatters::WithoutTimestamp.new
265
+ else
266
+ Sidekiq::Logger::Formatters::Pretty.new
267
+ end
268
+ end
269
+
270
+ def self.log_formatter=(log_formatter)
271
+ @log_formatter = log_formatter
272
+ logger.formatter = log_formatter
273
+ end
274
+
183
275
  def self.logger
184
- Sidekiq::Logging.logger
276
+ @logger ||= Sidekiq::Logger.new($stdout, level: :info)
277
+ end
278
+
279
+ def self.logger=(logger)
280
+ if logger.nil?
281
+ self.logger.level = Logger::FATAL
282
+ return self.logger
283
+ end
284
+
285
+ logger.extend(Sidekiq::LoggingUtils)
286
+
287
+ @logger = logger
288
+ end
289
+
290
+ def self.pro?
291
+ defined?(Sidekiq::Pro)
185
292
  end
186
- def self.logger=(log)
187
- Sidekiq::Logging.logger = log
293
+
294
+ def self.ent?
295
+ defined?(Sidekiq::Enterprise)
188
296
  end
189
297
 
190
298
  # How frequently Redis should be checked by a random Sidekiq process for
@@ -193,7 +301,7 @@ module Sidekiq
193
301
  #
194
302
  # See sidekiq/scheduled.rb for an in-depth explanation of this value
195
303
  def self.average_scheduled_poll_interval=(interval)
196
- self.options[:average_scheduled_poll_interval] = interval
304
+ self[:average_scheduled_poll_interval] = interval
197
305
  end
198
306
 
199
307
  # Register a proc to handle any error which occurs within the Sidekiq process.
@@ -204,7 +312,7 @@ module Sidekiq
204
312
  #
205
313
  # The default error handler logs errors to Sidekiq.logger.
206
314
  def self.error_handlers
207
- self.options[:error_handlers]
315
+ self[:error_handlers]
208
316
  end
209
317
 
210
318
  # Register a block to run at a point in the Sidekiq lifecycle.
@@ -217,21 +325,21 @@ module Sidekiq
217
325
  # end
218
326
  def self.on(event, &block)
219
327
  raise ArgumentError, "Symbols only please: #{event}" unless event.is_a?(Symbol)
220
- raise ArgumentError, "Invalid event name: #{event}" unless options[:lifecycle_events].key?(event)
221
- options[:lifecycle_events][event] << block
328
+ raise ArgumentError, "Invalid event name: #{event}" unless self[:lifecycle_events].key?(event)
329
+ self[:lifecycle_events][event] << block
222
330
  end
223
331
 
224
- # We are shutting down Sidekiq but what about workers that
332
+ def self.strict_args!(mode = :raise)
333
+ self[:on_complex_arguments] = mode
334
+ end
335
+
336
+ # We are shutting down Sidekiq but what about threads that
225
337
  # are working on some long job? This error is
226
- # raised in workers that have not finished within the hard
338
+ # raised in jobs that have not finished within the hard
227
339
  # timeout limit. This is needed to rollback db transactions,
228
340
  # otherwise Ruby's Thread#kill will commit. See #377.
229
- # DO NOT RESCUE THIS ERROR IN YOUR WORKERS
341
+ # DO NOT RESCUE THIS ERROR IN YOUR JOBS
230
342
  class Shutdown < Interrupt; end
231
-
232
343
  end
233
344
 
234
- require 'sidekiq/extensions/class_methods'
235
- require 'sidekiq/extensions/action_mailer'
236
- require 'sidekiq/extensions/active_record'
237
- require 'sidekiq/rails' if defined?(::Rails::Engine)
345
+ require "sidekiq/rails" if defined?(::Rails::Engine)
data/sidekiq.gemspec CHANGED
@@ -1,26 +1,28 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/sidekiq/version', __FILE__)
1
+ require_relative "lib/sidekiq/version"
3
2
 
4
3
  Gem::Specification.new do |gem|
5
- gem.authors = ["Mike Perham"]
6
- gem.email = ["mperham@gmail.com"]
7
- gem.summary = "Simple, efficient background processing for Ruby"
8
- gem.description = "Simple, efficient background processing for Ruby."
9
- gem.homepage = "http://sidekiq.org"
10
- gem.license = "LGPL-3.0"
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"
11
10
 
12
- gem.executables = ['sidekiq', 'sidekiqctl']
13
- gem.files = `git ls-files | grep -Ev '^(myapp|examples)'`.split("\n")
14
- gem.test_files = `git ls-files -- test/*`.split("\n")
15
- gem.name = "sidekiq"
16
- gem.require_paths = ["lib"]
17
- gem.version = Sidekiq::VERSION
18
- gem.add_dependency 'redis', '~> 3.2', '>= 3.2.1'
19
- gem.add_dependency 'connection_pool', '~> 2.2', '>= 2.2.0'
20
- gem.add_dependency 'concurrent-ruby', '~> 1.0'
21
- gem.add_dependency 'sinatra', '>= 1.4.7'
22
- gem.add_development_dependency 'redis-namespace', '~> 1.5', '>= 1.5.2'
23
- gem.add_development_dependency 'minitest', '~> 5.7', '>= 5.7.0'
24
- gem.add_development_dependency 'rake', '~> 10.0'
25
- gem.add_development_dependency 'rails', '~> 4', '>= 3.2.0'
11
+ gem.executables = ["sidekiq", "sidekiqmon"]
12
+ gem.files = ["sidekiq.gemspec", "README.md", "Changes.md", "LICENSE"] + `git ls-files | grep -E '^(bin|lib|web)'`.split("\n")
13
+ gem.name = "sidekiq"
14
+ gem.version = Sidekiq::VERSION
15
+ gem.required_ruby_version = ">= 2.5.0"
16
+
17
+ gem.metadata = {
18
+ "homepage_uri" => "https://sidekiq.org",
19
+ "bug_tracker_uri" => "https://github.com/mperham/sidekiq/issues",
20
+ "documentation_uri" => "https://github.com/mperham/sidekiq/wiki",
21
+ "changelog_uri" => "https://github.com/mperham/sidekiq/blob/main/Changes.md",
22
+ "source_code_uri" => "https://github.com/mperham/sidekiq"
23
+ }
24
+
25
+ gem.add_dependency "redis", "<5", ">= 4.5.0"
26
+ gem.add_dependency "connection_pool", ">= 2.2.5"
27
+ gem.add_dependency "rack", "~> 2.0"
26
28
  end