sidekiq 3.5.4 → 7.2.0

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 (228) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +992 -6
  3. data/LICENSE.txt +9 -0
  4. data/README.md +52 -43
  5. data/bin/sidekiq +22 -4
  6. data/bin/sidekiqload +209 -115
  7. data/bin/sidekiqmon +11 -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 +633 -295
  13. data/lib/sidekiq/capsule.rb +127 -0
  14. data/lib/sidekiq/cli.rb +270 -248
  15. data/lib/sidekiq/client.rb +139 -108
  16. data/lib/sidekiq/component.rb +68 -0
  17. data/lib/sidekiq/config.rb +287 -0
  18. data/lib/sidekiq/deploy.rb +62 -0
  19. data/lib/sidekiq/embedded.rb +61 -0
  20. data/lib/sidekiq/fetch.rb +53 -121
  21. data/lib/sidekiq/job.rb +374 -0
  22. data/lib/sidekiq/job_logger.rb +51 -0
  23. data/lib/sidekiq/job_retry.rb +301 -0
  24. data/lib/sidekiq/job_util.rb +107 -0
  25. data/lib/sidekiq/launcher.rb +241 -69
  26. data/lib/sidekiq/logger.rb +131 -0
  27. data/lib/sidekiq/manager.rb +88 -190
  28. data/lib/sidekiq/metrics/query.rb +155 -0
  29. data/lib/sidekiq/metrics/shared.rb +95 -0
  30. data/lib/sidekiq/metrics/tracking.rb +136 -0
  31. data/lib/sidekiq/middleware/chain.rb +114 -56
  32. data/lib/sidekiq/middleware/current_attributes.rb +95 -0
  33. data/lib/sidekiq/middleware/i18n.rb +8 -7
  34. data/lib/sidekiq/middleware/modules.rb +21 -0
  35. data/lib/sidekiq/monitor.rb +146 -0
  36. data/lib/sidekiq/paginator.rb +29 -16
  37. data/lib/sidekiq/processor.rb +238 -118
  38. data/lib/sidekiq/rails.rb +57 -27
  39. data/lib/sidekiq/redis_client_adapter.rb +111 -0
  40. data/lib/sidekiq/redis_connection.rb +49 -50
  41. data/lib/sidekiq/ring_buffer.rb +29 -0
  42. data/lib/sidekiq/scheduled.rb +173 -52
  43. data/lib/sidekiq/sd_notify.rb +149 -0
  44. data/lib/sidekiq/systemd.rb +24 -0
  45. data/lib/sidekiq/testing/inline.rb +7 -5
  46. data/lib/sidekiq/testing.rb +197 -65
  47. data/lib/sidekiq/transaction_aware_client.rb +44 -0
  48. data/lib/sidekiq/version.rb +4 -1
  49. data/lib/sidekiq/web/action.rb +93 -0
  50. data/lib/sidekiq/web/application.rb +463 -0
  51. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  52. data/lib/sidekiq/web/helpers.rb +364 -0
  53. data/lib/sidekiq/web/router.rb +104 -0
  54. data/lib/sidekiq/web.rb +113 -216
  55. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  56. data/lib/sidekiq.rb +99 -142
  57. data/sidekiq.gemspec +26 -23
  58. data/web/assets/images/apple-touch-icon.png +0 -0
  59. data/web/assets/javascripts/application.js +163 -74
  60. data/web/assets/javascripts/base-charts.js +106 -0
  61. data/web/assets/javascripts/chart.min.js +13 -0
  62. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  63. data/web/assets/javascripts/dashboard-charts.js +182 -0
  64. data/web/assets/javascripts/dashboard.js +37 -280
  65. data/web/assets/javascripts/metrics.js +298 -0
  66. data/web/assets/stylesheets/application-dark.css +147 -0
  67. data/web/assets/stylesheets/application-rtl.css +153 -0
  68. data/web/assets/stylesheets/application.css +181 -198
  69. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  70. data/web/assets/stylesheets/bootstrap.css +4 -8
  71. data/web/locales/ar.yml +87 -0
  72. data/web/locales/cs.yml +62 -52
  73. data/web/locales/da.yml +60 -53
  74. data/web/locales/de.yml +65 -53
  75. data/web/locales/el.yml +43 -24
  76. data/web/locales/en.yml +86 -62
  77. data/web/locales/es.yml +70 -53
  78. data/web/locales/fa.yml +80 -0
  79. data/web/locales/fr.yml +86 -56
  80. data/web/locales/gd.yml +99 -0
  81. data/web/locales/he.yml +80 -0
  82. data/web/locales/hi.yml +59 -59
  83. data/web/locales/it.yml +53 -53
  84. data/web/locales/ja.yml +78 -56
  85. data/web/locales/ko.yml +52 -52
  86. data/web/locales/lt.yml +83 -0
  87. data/web/locales/nb.yml +61 -61
  88. data/web/locales/nl.yml +52 -52
  89. data/web/locales/pl.yml +45 -45
  90. data/web/locales/pt-br.yml +83 -55
  91. data/web/locales/pt.yml +51 -51
  92. data/web/locales/ru.yml +68 -60
  93. data/web/locales/sv.yml +53 -53
  94. data/web/locales/ta.yml +60 -60
  95. data/web/locales/uk.yml +62 -61
  96. data/web/locales/ur.yml +80 -0
  97. data/web/locales/vi.yml +83 -0
  98. data/web/locales/zh-cn.yml +43 -16
  99. data/web/locales/zh-tw.yml +42 -8
  100. data/web/views/_footer.erb +10 -9
  101. data/web/views/_job_info.erb +26 -5
  102. data/web/views/_metrics_period_select.erb +12 -0
  103. data/web/views/_nav.erb +6 -20
  104. data/web/views/_paging.erb +3 -1
  105. data/web/views/_poll_link.erb +3 -6
  106. data/web/views/_summary.erb +7 -7
  107. data/web/views/busy.erb +87 -28
  108. data/web/views/dashboard.erb +51 -21
  109. data/web/views/dead.erb +4 -4
  110. data/web/views/filtering.erb +7 -0
  111. data/web/views/layout.erb +15 -5
  112. data/web/views/metrics.erb +91 -0
  113. data/web/views/metrics_for_job.erb +59 -0
  114. data/web/views/morgue.erb +25 -22
  115. data/web/views/queue.erb +35 -25
  116. data/web/views/queues.erb +23 -7
  117. data/web/views/retries.erb +28 -23
  118. data/web/views/retry.erb +5 -5
  119. data/web/views/scheduled.erb +19 -17
  120. data/web/views/scheduled_job_info.erb +1 -1
  121. metadata +86 -268
  122. data/.gitignore +0 -12
  123. data/.travis.yml +0 -16
  124. data/3.0-Upgrade.md +0 -70
  125. data/COMM-LICENSE +0 -95
  126. data/Contributing.md +0 -32
  127. data/Ent-Changes.md +0 -39
  128. data/Gemfile +0 -27
  129. data/LICENSE +0 -9
  130. data/Pro-2.0-Upgrade.md +0 -138
  131. data/Pro-Changes.md +0 -454
  132. data/Rakefile +0 -9
  133. data/bin/sidekiqctl +0 -93
  134. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +0 -6
  135. data/lib/generators/sidekiq/templates/worker_test.rb.erb +0 -8
  136. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  137. data/lib/sidekiq/actor.rb +0 -39
  138. data/lib/sidekiq/core_ext.rb +0 -105
  139. data/lib/sidekiq/exception_handler.rb +0 -30
  140. data/lib/sidekiq/extensions/action_mailer.rb +0 -56
  141. data/lib/sidekiq/extensions/active_record.rb +0 -39
  142. data/lib/sidekiq/extensions/class_methods.rb +0 -39
  143. data/lib/sidekiq/extensions/generic_proxy.rb +0 -24
  144. data/lib/sidekiq/logging.rb +0 -104
  145. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  146. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  147. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -206
  148. data/lib/sidekiq/util.rb +0 -68
  149. data/lib/sidekiq/web_helpers.rb +0 -249
  150. data/lib/sidekiq/worker.rb +0 -103
  151. data/test/config.yml +0 -9
  152. data/test/env_based_config.yml +0 -11
  153. data/test/fake_env.rb +0 -0
  154. data/test/fixtures/en.yml +0 -2
  155. data/test/helper.rb +0 -49
  156. data/test/test_api.rb +0 -493
  157. data/test/test_cli.rb +0 -335
  158. data/test/test_client.rb +0 -194
  159. data/test/test_exception_handler.rb +0 -55
  160. data/test/test_extensions.rb +0 -126
  161. data/test/test_fetch.rb +0 -104
  162. data/test/test_logging.rb +0 -34
  163. data/test/test_manager.rb +0 -168
  164. data/test/test_middleware.rb +0 -159
  165. data/test/test_processor.rb +0 -237
  166. data/test/test_rails.rb +0 -21
  167. data/test/test_redis_connection.rb +0 -126
  168. data/test/test_retry.rb +0 -325
  169. data/test/test_scheduled.rb +0 -114
  170. data/test/test_scheduling.rb +0 -49
  171. data/test/test_sidekiq.rb +0 -99
  172. data/test/test_testing.rb +0 -142
  173. data/test/test_testing_fake.rb +0 -268
  174. data/test/test_testing_inline.rb +0 -93
  175. data/test/test_util.rb +0 -16
  176. data/test/test_web.rb +0 -608
  177. data/test/test_web_helpers.rb +0 -53
  178. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  179. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  180. data/web/assets/images/status/active.png +0 -0
  181. data/web/assets/images/status/idle.png +0 -0
  182. data/web/assets/javascripts/locales/README.md +0 -27
  183. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  184. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  185. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  186. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  187. data/web/assets/javascripts/locales/jquery.timeago.cs.js +0 -18
  188. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  189. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  190. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  191. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  192. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  193. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  194. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  195. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  196. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  197. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  198. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  199. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  200. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  201. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  202. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  203. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  204. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  205. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  206. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  207. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  208. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  209. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  210. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  211. data/web/assets/javascripts/locales/jquery.timeago.no.js +0 -18
  212. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  213. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  214. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  215. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  216. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  217. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  218. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  219. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  220. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  221. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  222. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  223. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  224. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  225. data/web/assets/javascripts/locales/jquery.timeago.zh-cn.js +0 -20
  226. data/web/assets/javascripts/locales/jquery.timeago.zh-tw.js +0 -20
  227. data/web/views/_poll_js.erb +0 -5
  228. /data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
data/lib/sidekiq/util.rb DELETED
@@ -1,68 +0,0 @@
1
- require 'socket'
2
- require 'securerandom'
3
- require 'sidekiq/exception_handler'
4
- require 'sidekiq/core_ext'
5
-
6
- module Sidekiq
7
- ##
8
- # This module is part of Sidekiq core and not intended for extensions.
9
- #
10
- module Util
11
- include ExceptionHandler
12
-
13
- EXPIRY = 60 * 60 * 24
14
-
15
- def watchdog(last_words)
16
- yield
17
- rescue Exception => ex
18
- handle_exception(ex, { context: last_words })
19
- raise ex
20
- end
21
-
22
- def logger
23
- Sidekiq.logger
24
- end
25
-
26
- def redis(&block)
27
- Sidekiq.redis(&block)
28
- end
29
-
30
- def hostname
31
- ENV['DYNO'] || Socket.gethostname
32
- end
33
-
34
- def process_nonce
35
- @@process_nonce ||= SecureRandom.hex(6)
36
- end
37
-
38
- def identity
39
- @@identity ||= "#{hostname}:#{$$}:#{process_nonce}"
40
- end
41
-
42
- def fire_event(event, reverse=false)
43
- arr = Sidekiq.options[:lifecycle_events][event]
44
- arr.reverse! if reverse
45
- arr.each do |block|
46
- begin
47
- block.call
48
- rescue => ex
49
- handle_exception(ex, { event: event })
50
- end
51
- end
52
- end
53
-
54
- def want_a_hertz_donut?
55
- # what's a hertz donut?
56
- # punch! Hurts, don't it?
57
- info = Sidekiq.redis {|c| c.info }
58
- if info['connected_clients'].to_i > 1000 && info['hz'].to_i >= 10
59
- Sidekiq.logger.warn { "Your Redis `hz` setting is too high at #{info['hz']}. See mperham/sidekiq#2431. Set it to 3 in #{info[:config_file]}" }
60
- true
61
- else
62
- Sidekiq.logger.debug { "Redis hz: #{info['hz']}. Client count: #{info['connected_clients']}" }
63
- false
64
- end
65
- end
66
-
67
- end
68
- end
@@ -1,249 +0,0 @@
1
- require 'uri'
2
-
3
- module Sidekiq
4
- # This is not a public API
5
- module WebHelpers
6
- def strings(lang)
7
- @@strings ||= {}
8
- @@strings[lang] ||= begin
9
- # Allow sidekiq-web extensions to add locale paths
10
- # so extensions can be localized
11
- settings.locales.each_with_object({}) do |path, global|
12
- find_locale_files(lang).each do |file|
13
- strs = YAML.load(File.open(file))
14
- global.deep_merge!(strs[lang])
15
- end
16
- end
17
- end
18
- end
19
-
20
- def locale_files
21
- @@locale_files = settings.locales.flat_map do |path|
22
- Dir["#{path}/*.yml"]
23
- end
24
- end
25
-
26
- def find_locale_files(lang)
27
- locale_files.select { |file| file =~ /\/#{lang}\.yml$/ }
28
- end
29
-
30
- # This is a hook for a Sidekiq Pro feature. Please don't touch.
31
- def filtering(*)
32
- end
33
-
34
- # This view helper provide ability display you html code in
35
- # to head of page. Example:
36
- #
37
- # <% add_to_head do %>
38
- # <link rel="stylesheet" .../>
39
- # <meta .../>
40
- # <% end %>
41
- #
42
- def add_to_head(&block)
43
- @head_html ||= []
44
- @head_html << block if block_given?
45
- end
46
-
47
- def display_custom_head
48
- return unless defined?(@head_html)
49
- @head_html.map { |block| capture(&block) }.join
50
- end
51
-
52
- # Simple capture method for erb templates. The origin was
53
- # capture method from sinatra-contrib library.
54
- def capture(&block)
55
- block.call
56
- eval('', block.binding)
57
- end
58
-
59
- # Given a browser request Accept-Language header like
60
- # "fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4,ru;q=0.2", this function
61
- # will return "fr" since that's the first code with a matching
62
- # locale in web/locales
63
- def locale
64
- @locale ||= begin
65
- locale = 'en'.freeze
66
- languages = request.env['HTTP_ACCEPT_LANGUAGE'.freeze] || 'en'.freeze
67
- languages.downcase.split(','.freeze).each do |lang|
68
- next if lang == '*'.freeze
69
- lang = lang.split(';'.freeze)[0]
70
- break locale = lang if find_locale_files(lang).any?
71
- end
72
- locale
73
- end
74
- end
75
-
76
- def get_locale
77
- strings(locale)
78
- end
79
-
80
- def t(msg, options={})
81
- string = get_locale[msg] || msg
82
- if options.empty?
83
- string
84
- else
85
- string % options
86
- end
87
- end
88
-
89
- def workers
90
- @workers ||= Sidekiq::Workers.new
91
- end
92
-
93
- def processes
94
- @processes ||= Sidekiq::ProcessSet.new
95
- end
96
-
97
- def stats
98
- @stats ||= Sidekiq::Stats.new
99
- end
100
-
101
- def retries_with_score(score)
102
- Sidekiq.redis do |conn|
103
- conn.zrangebyscore('retry', score, score)
104
- end.map { |msg| Sidekiq.load_json(msg) }
105
- end
106
-
107
- def location
108
- Sidekiq.redis { |conn| conn.client.location }
109
- end
110
-
111
- def redis_connection
112
- Sidekiq.redis { |conn| conn.client.id }
113
- end
114
-
115
- def namespace
116
- @@ns ||= Sidekiq.redis { |conn| conn.respond_to?(:namespace) ? conn.namespace : nil }
117
- end
118
-
119
- def redis_info
120
- Sidekiq.redis do |conn|
121
- # admin commands can't go through redis-namespace starting
122
- # in redis-namespace 2.0
123
- if conn.respond_to?(:namespace)
124
- conn.redis.info
125
- else
126
- conn.info
127
- end
128
- end
129
- end
130
-
131
- def root_path
132
- "#{env['SCRIPT_NAME']}/"
133
- end
134
-
135
- def current_path
136
- @current_path ||= request.path_info.gsub(/^\//,'')
137
- end
138
-
139
- def current_status
140
- workers.size == 0 ? 'idle' : 'active'
141
- end
142
-
143
- def relative_time(time)
144
- %{<time datetime="#{time.getutc.iso8601}">#{time}</time>}
145
- end
146
-
147
- def job_params(job, score)
148
- "#{score}-#{job['jid']}"
149
- end
150
-
151
- def parse_params(params)
152
- score, jid = params.split("-")
153
- [score.to_f, jid]
154
- end
155
-
156
- SAFE_QPARAMS = %w(page poll)
157
-
158
- # Merge options with current params, filter safe params, and stringify to query string
159
- def qparams(options)
160
- options = options.stringify_keys
161
- params.merge(options).map do |key, value|
162
- SAFE_QPARAMS.include?(key) ? "#{key}=#{value}" : next
163
- end.join("&")
164
- end
165
-
166
- def truncate(text, truncate_after_chars = 2000)
167
- truncate_after_chars && text.size > truncate_after_chars ? "#{text[0..truncate_after_chars]}..." : text
168
- end
169
-
170
- def display_args(args, truncate_after_chars = 2000)
171
- args.map do |arg|
172
- h(truncate(to_display(arg)))
173
- end.join(", ")
174
- end
175
-
176
- def csrf_tag
177
- "<input type='hidden' name='authenticity_token' value='#{session[:csrf]}'/>"
178
- end
179
-
180
- def to_display(arg)
181
- begin
182
- arg.inspect
183
- rescue
184
- begin
185
- arg.to_s
186
- rescue => ex
187
- "Cannot display argument: [#{ex.class.name}] #{ex.message}"
188
- end
189
- end
190
- end
191
-
192
- RETRY_JOB_KEYS = Set.new(%w(
193
- queue class args retry_count retried_at failed_at
194
- jid error_message error_class backtrace
195
- error_backtrace enqueued_at retry wrapped
196
- ))
197
-
198
- def retry_extra_items(retry_job)
199
- @retry_extra_items ||= {}.tap do |extra|
200
- retry_job.item.each do |key, value|
201
- extra[key] = value unless RETRY_JOB_KEYS.include?(key)
202
- end
203
- end
204
- end
205
-
206
- def number_with_delimiter(number)
207
- begin
208
- Float(number)
209
- rescue ArgumentError, TypeError
210
- return number
211
- end
212
-
213
- options = {delimiter: ',', separator: '.'}
214
- parts = number.to_s.to_str.split('.')
215
- parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{options[:delimiter]}")
216
- parts.join(options[:separator])
217
- end
218
-
219
- def h(text)
220
- ::Rack::Utils.escape_html(text)
221
- rescue ArgumentError => e
222
- raise unless e.message.eql?('invalid byte sequence in UTF-8')
223
- text.encode!('UTF-16', 'UTF-8', invalid: :replace, replace: '').encode!('UTF-8', 'UTF-16')
224
- retry
225
- end
226
-
227
- # Any paginated list that performs an action needs to redirect
228
- # back to the proper page after performing that action.
229
- def redirect_with_query(url)
230
- r = request.referer
231
- if r && r =~ /\?/
232
- ref = URI(r)
233
- redirect("#{url}?#{ref.query}")
234
- else
235
- redirect url
236
- end
237
- end
238
-
239
- def environment_title_prefix
240
- environment = Sidekiq.options[:environment] || ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development'
241
-
242
- "[#{environment.upcase}] " unless environment == "production"
243
- end
244
-
245
- def product_version
246
- "Sidekiq v#{Sidekiq::VERSION}"
247
- end
248
- end
249
- end
@@ -1,103 +0,0 @@
1
- require 'sidekiq/client'
2
- require 'sidekiq/core_ext'
3
-
4
- module Sidekiq
5
-
6
- ##
7
- # Include this module in your worker class and you can easily create
8
- # asynchronous jobs:
9
- #
10
- # class HardWorker
11
- # include Sidekiq::Worker
12
- #
13
- # def perform(*args)
14
- # # do some work
15
- # end
16
- # end
17
- #
18
- # Then in your Rails app, you can do this:
19
- #
20
- # HardWorker.perform_async(1, 2, 3)
21
- #
22
- # Note that perform_async is a class method, perform is an instance method.
23
- module Worker
24
- attr_accessor :jid
25
-
26
- def self.included(base)
27
- raise ArgumentError, "You cannot include Sidekiq::Worker in an ActiveJob: #{base.name}" if base.ancestors.any? {|c| c.name == 'ActiveJob::Base' }
28
-
29
- base.extend(ClassMethods)
30
- base.class_attribute :sidekiq_options_hash
31
- base.class_attribute :sidekiq_retry_in_block
32
- base.class_attribute :sidekiq_retries_exhausted_block
33
- end
34
-
35
- def logger
36
- Sidekiq.logger
37
- end
38
-
39
- module ClassMethods
40
-
41
- def delay(*args)
42
- raise ArgumentError, "Do not call .delay on a Sidekiq::Worker class, call .perform_async"
43
- end
44
-
45
- def delay_for(*args)
46
- raise ArgumentError, "Do not call .delay_for on a Sidekiq::Worker class, call .perform_in"
47
- end
48
-
49
- def delay_until(*args)
50
- raise ArgumentError, "Do not call .delay_until on a Sidekiq::Worker class, call .perform_at"
51
- end
52
-
53
- def perform_async(*args)
54
- client_push('class' => self, 'args' => args)
55
- end
56
-
57
- def perform_in(interval, *args)
58
- int = interval.to_f
59
- now = Time.now
60
- ts = (int < 1_000_000_000 ? (now + interval).to_f : int)
61
-
62
- item = { 'class' => self, 'args' => args, 'at' => ts }
63
-
64
- # Optimization to enqueue something now that is scheduled to go out now or in the past
65
- item.delete('at'.freeze) if ts <= now.to_f
66
-
67
- client_push(item)
68
- end
69
- alias_method :perform_at, :perform_in
70
-
71
- ##
72
- # Allows customization for this type of Worker.
73
- # Legal options:
74
- #
75
- # :queue - use a named queue for this Worker, default 'default'
76
- # :retry - enable the RetryJobs middleware for this Worker, default *true*
77
- # :backtrace - whether to save any error backtrace in the retry payload to display in web UI,
78
- # can be true, false or an integer number of lines to save, default *false*
79
- # :pool - use the given Redis connection pool to push this type of job to a given shard.
80
- def sidekiq_options(opts={})
81
- self.sidekiq_options_hash = get_sidekiq_options.merge(opts.stringify_keys)
82
- end
83
-
84
- def sidekiq_retry_in(&block)
85
- self.sidekiq_retry_in_block = block
86
- end
87
-
88
- def sidekiq_retries_exhausted(&block)
89
- self.sidekiq_retries_exhausted_block = block
90
- end
91
-
92
- def get_sidekiq_options # :nodoc:
93
- self.sidekiq_options_hash ||= Sidekiq.default_worker_options
94
- end
95
-
96
- def client_push(item) # :nodoc:
97
- pool = Thread.current[:sidekiq_via_pool] || get_sidekiq_options['pool'] || Sidekiq.redis_pool
98
- Sidekiq::Client.new(pool).push(item.stringify_keys)
99
- end
100
-
101
- end
102
- end
103
- end
data/test/config.yml DELETED
@@ -1,9 +0,0 @@
1
- ---
2
- :verbose: false
3
- :require: ./test/fake_env.rb
4
- :pidfile: /tmp/sidekiq-config-test.pid
5
- :logfile: /tmp/sidekiq.log
6
- :concurrency: 50
7
- :queues:
8
- - [<%="very_"%>often, 2]
9
- - [seldom, 1]
@@ -1,11 +0,0 @@
1
- ---
2
- :pidfile: /tmp/sidekiq-config-test.pid
3
- :concurrency: 50
4
- staging:
5
- :verbose: false
6
- :require: ./test/fake_env.rb
7
- :logfile: /tmp/sidekiq.log
8
- :concurrency: 5
9
- :queues:
10
- - [<%="very_"%>often, 2]
11
- - [seldom, 1]
data/test/fake_env.rb DELETED
File without changes
data/test/fixtures/en.yml DELETED
@@ -1,2 +0,0 @@
1
- en:
2
- translated_text: 'Changed text from add locals'
data/test/helper.rb DELETED
@@ -1,49 +0,0 @@
1
- $CELLULOID_DEBUG = false
2
- $TESTING = true
3
- if ENV["COVERAGE"]
4
- require 'simplecov'
5
- SimpleCov.start do
6
- add_filter "/test/"
7
- add_filter "/myapp/"
8
- end
9
- end
10
- ENV['RACK_ENV'] = ENV['RAILS_ENV'] = 'test'
11
-
12
- begin
13
- require 'pry-byebug'
14
- rescue LoadError
15
- end
16
-
17
- require 'minitest/autorun'
18
- require 'minitest/pride'
19
-
20
- require 'celluloid/current'
21
- require 'celluloid/test'
22
- Celluloid.boot
23
- require 'sidekiq'
24
- require 'sidekiq/util'
25
- Sidekiq.logger.level = Logger::ERROR
26
-
27
- Sidekiq::Test = Minitest::Test
28
-
29
- require 'sidekiq/redis_connection'
30
- REDIS_URL = ENV['REDIS_URL'] || 'redis://localhost/15'
31
- REDIS = Sidekiq::RedisConnection.create(:url => REDIS_URL, :namespace => 'testy')
32
-
33
- Sidekiq.configure_client do |config|
34
- config.redis = { :url => REDIS_URL, :namespace => 'testy' }
35
- end
36
-
37
- def capture_logging(lvl=Logger::INFO)
38
- old = Sidekiq.logger
39
- begin
40
- out = StringIO.new
41
- logger = Logger.new(out)
42
- logger.level = lvl
43
- Sidekiq.logger = logger
44
- yield
45
- out.string
46
- ensure
47
- Sidekiq.logger = old
48
- end
49
- end