activejob 6.1.7.8 → 7.0.0.alpha1
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/CHANGELOG.md +36 -247
- data/MIT-LICENSE +2 -1
- data/README.md +3 -3
- data/lib/active_job/arguments.rb +10 -15
- data/lib/active_job/base.rb +2 -2
- data/lib/active_job/configured_job.rb +5 -7
- data/lib/active_job/core.rb +11 -1
- data/lib/active_job/enqueuing.rb +22 -9
- data/lib/active_job/exceptions.rb +4 -2
- data/lib/active_job/execution.rb +12 -8
- data/lib/active_job/gem_version.rb +4 -4
- data/lib/active_job/instrumentation.rb +9 -5
- data/lib/active_job/log_subscriber.rb +1 -1
- data/lib/active_job/logging.rb +8 -5
- data/lib/active_job/query_tags.rb +16 -0
- data/lib/active_job/queue_adapter.rb +1 -1
- data/lib/active_job/queue_adapters/async_adapter.rb +6 -6
- data/lib/active_job/queue_adapters/backburner_adapter.rb +3 -3
- data/lib/active_job/queue_adapters/delayed_job_adapter.rb +14 -4
- data/lib/active_job/queue_adapters/inline_adapter.rb +2 -2
- data/lib/active_job/queue_adapters/que_adapter.rb +3 -3
- data/lib/active_job/queue_adapters/queue_classic_adapter.rb +3 -3
- data/lib/active_job/queue_adapters/resque_adapter.rb +3 -3
- data/lib/active_job/queue_adapters/sidekiq_adapter.rb +3 -3
- data/lib/active_job/queue_adapters/sneakers_adapter.rb +3 -3
- data/lib/active_job/queue_adapters/sucker_punch_adapter.rb +3 -3
- data/lib/active_job/queue_adapters/test_adapter.rb +3 -2
- data/lib/active_job/queue_name.rb +1 -1
- data/lib/active_job/railtie.rb +26 -1
- data/lib/active_job/serializers/range_serializer.rb +23 -0
- data/lib/active_job/serializers.rb +3 -1
- data/lib/active_job/test_helper.rb +7 -7
- data/lib/active_job/timezones.rb +1 -1
- data/lib/active_job/translation.rb +1 -1
- data/lib/active_job.rb +2 -1
- metadata +16 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34ec9d3dc4bb88ce5c06f50a5efb7d34fb383b38088a400a1dc307329be429a9
|
4
|
+
data.tar.gz: 8d2a9541a56b633fabb47adbf164d6568f7487ab07f5749e96917320c5f66b0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52b3116d2eba23f548e2af97a90a31fb544a0bb8c53e2642b6d0d8cdc03d419dc2de8bac6243b409b32d15fbf1af4da42e356f19df765d6b708b5b55b7283bb9
|
7
|
+
data.tar.gz: b8f3195cf56348deed886b834fe67a9f036b931f7b93c386888411d6aabc84467d87fc0a56ac2263b9d21df0e8294a3438d80e0748099ec1bd28bfcd4940c96e
|
data/CHANGELOG.md
CHANGED
@@ -1,271 +1,60 @@
|
|
1
|
-
## Rails
|
1
|
+
## Rails 7.0.0.alpha1 (September 15, 2021) ##
|
2
2
|
|
3
|
-
*
|
3
|
+
* Allow a job to retry indefinitely
|
4
4
|
|
5
|
+
The `attempts` parameter of the `retry_on` method now accepts the
|
6
|
+
symbol reference `:unlimited` in addition to a specific number of retry
|
7
|
+
attempts to allow a developer to specify that a job should retry
|
8
|
+
forever until it succeeds.
|
5
9
|
|
6
|
-
|
10
|
+
class MyJob < ActiveJob::Base
|
11
|
+
retry_on(AlwaysRetryException, attempts: :unlimited)
|
7
12
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
## Rails 6.1.7.6 (August 22, 2023) ##
|
12
|
-
|
13
|
-
* No changes.
|
14
|
-
|
15
|
-
|
16
|
-
## Rails 6.1.7.5 (August 22, 2023) ##
|
17
|
-
|
18
|
-
* No changes.
|
19
|
-
|
20
|
-
|
21
|
-
## Rails 6.1.7.4 (June 26, 2023) ##
|
22
|
-
|
23
|
-
* No changes.
|
24
|
-
|
25
|
-
|
26
|
-
## Rails 6.1.7.3 (March 13, 2023) ##
|
27
|
-
|
28
|
-
* No changes.
|
29
|
-
|
30
|
-
|
31
|
-
## Rails 6.1.7.2 (January 24, 2023) ##
|
32
|
-
|
33
|
-
* No changes.
|
34
|
-
|
35
|
-
|
36
|
-
## Rails 6.1.7.1 (January 17, 2023) ##
|
37
|
-
|
38
|
-
* No changes.
|
39
|
-
|
40
|
-
|
41
|
-
## Rails 6.1.7 (September 09, 2022) ##
|
42
|
-
|
43
|
-
* No changes.
|
44
|
-
|
45
|
-
|
46
|
-
## Rails 6.1.6.1 (July 12, 2022) ##
|
47
|
-
|
48
|
-
* No changes.
|
49
|
-
|
50
|
-
|
51
|
-
## Rails 6.1.6 (May 09, 2022) ##
|
52
|
-
|
53
|
-
* No changes.
|
54
|
-
|
55
|
-
|
56
|
-
## Rails 6.1.5.1 (April 26, 2022) ##
|
57
|
-
|
58
|
-
* No changes.
|
59
|
-
|
60
|
-
|
61
|
-
## Rails 6.1.5 (March 09, 2022) ##
|
62
|
-
|
63
|
-
* No changes.
|
64
|
-
|
65
|
-
|
66
|
-
## Rails 6.1.4.7 (March 08, 2022) ##
|
67
|
-
|
68
|
-
* No changes.
|
69
|
-
|
70
|
-
|
71
|
-
## Rails 6.1.4.6 (February 11, 2022) ##
|
72
|
-
|
73
|
-
* No changes.
|
74
|
-
|
75
|
-
|
76
|
-
## Rails 6.1.4.5 (February 11, 2022) ##
|
77
|
-
|
78
|
-
* No changes.
|
79
|
-
|
80
|
-
|
81
|
-
## Rails 6.1.4.4 (December 15, 2021) ##
|
82
|
-
|
83
|
-
* No changes.
|
84
|
-
|
85
|
-
|
86
|
-
## Rails 6.1.4.3 (December 14, 2021) ##
|
87
|
-
|
88
|
-
* No changes.
|
89
|
-
|
90
|
-
|
91
|
-
## Rails 6.1.4.2 (December 14, 2021) ##
|
92
|
-
|
93
|
-
* No changes.
|
94
|
-
|
95
|
-
|
96
|
-
## Rails 6.1.4.1 (August 19, 2021) ##
|
97
|
-
|
98
|
-
* No changes.
|
99
|
-
|
100
|
-
|
101
|
-
## Rails 6.1.4 (June 24, 2021) ##
|
102
|
-
|
103
|
-
* No changes.
|
104
|
-
|
105
|
-
|
106
|
-
## Rails 6.1.3.2 (May 05, 2021) ##
|
107
|
-
|
108
|
-
* No changes.
|
109
|
-
|
110
|
-
|
111
|
-
## Rails 6.1.3.1 (March 26, 2021) ##
|
112
|
-
|
113
|
-
* No changes.
|
114
|
-
|
115
|
-
|
116
|
-
## Rails 6.1.3 (February 17, 2021) ##
|
117
|
-
|
118
|
-
* No changes.
|
119
|
-
|
120
|
-
|
121
|
-
## Rails 6.1.2.1 (February 10, 2021) ##
|
122
|
-
|
123
|
-
* No changes.
|
124
|
-
|
125
|
-
|
126
|
-
## Rails 6.1.2 (February 09, 2021) ##
|
127
|
-
|
128
|
-
* No changes.
|
129
|
-
|
130
|
-
|
131
|
-
## Rails 6.1.1 (January 07, 2021) ##
|
132
|
-
|
133
|
-
* Make `retry_job` return the job that was created.
|
134
|
-
|
135
|
-
*Rafael Mendonça França*
|
136
|
-
|
137
|
-
* Include `ActiveSupport::Testing::Assertions` in `ActiveJob::TestHelpers`.
|
138
|
-
|
139
|
-
*Mikkel Malmberg*
|
140
|
-
|
141
|
-
|
142
|
-
## Rails 6.1.0 (December 09, 2020) ##
|
143
|
-
|
144
|
-
* Recover nano precision when serializing `Time`, `TimeWithZone` and `DateTime` objects.
|
145
|
-
|
146
|
-
*Alan Tan*
|
147
|
-
|
148
|
-
* Deprecate `config.active_job.return_false_on_aborted_enqueue`.
|
149
|
-
|
150
|
-
*Rafael Mendonça França*
|
151
|
-
|
152
|
-
* Return `false` when enqueuing a job is aborted.
|
153
|
-
|
154
|
-
*Rafael Mendonça França*
|
155
|
-
|
156
|
-
* While using `perform_enqueued_jobs` test helper enqueued jobs must be stored for the later check with
|
157
|
-
`assert_enqueued_with`.
|
158
|
-
|
159
|
-
*Dmitry Polushkin*
|
160
|
-
|
161
|
-
* `ActiveJob::TestCase#perform_enqueued_jobs` without a block removes performed jobs from the queue.
|
162
|
-
|
163
|
-
That way the helper can be called multiple times and not perform a job invocation multiple times.
|
164
|
-
|
165
|
-
```ruby
|
166
|
-
def test_jobs
|
167
|
-
HelloJob.perform_later("rafael")
|
168
|
-
perform_enqueued_jobs # only runs with "rafael"
|
169
|
-
HelloJob.perform_later("david")
|
170
|
-
perform_enqueued_jobs # only runs with "david"
|
171
|
-
end
|
172
|
-
```
|
173
|
-
|
174
|
-
*Étienne Barrié*
|
175
|
-
|
176
|
-
* `ActiveJob::TestCase#perform_enqueued_jobs` will no longer perform retries:
|
177
|
-
|
178
|
-
When calling `perform_enqueued_jobs` without a block, the adapter will
|
179
|
-
now perform jobs that are **already** in the queue. Jobs that will end up in
|
180
|
-
the queue afterwards won't be performed.
|
181
|
-
|
182
|
-
This change only affects `perform_enqueued_jobs` when no block is given.
|
183
|
-
|
184
|
-
*Edouard Chin*
|
185
|
-
|
186
|
-
* Add queue name support to Que adapter.
|
187
|
-
|
188
|
-
*Brad Nauta*, *Wojciech Wnętrzak*
|
189
|
-
|
190
|
-
* Don't run `after_enqueue` and `after_perform` callbacks if the callback chain is halted.
|
191
|
-
|
192
|
-
class MyJob < ApplicationJob
|
193
|
-
before_enqueue { throw(:abort) }
|
194
|
-
after_enqueue { # won't enter here anymore }
|
13
|
+
# the actual job code
|
195
14
|
end
|
196
15
|
|
197
|
-
|
198
|
-
This behaviour is a breaking change and won't take effect until Rails 7.0.
|
199
|
-
To enable this behaviour in your app right now, you can add in your app's configuration file
|
200
|
-
`config.active_job.skip_after_callbacks_if_terminated = true`.
|
201
|
-
|
202
|
-
*Edouard Chin*
|
16
|
+
*Daniel Morton*
|
203
17
|
|
204
|
-
*
|
18
|
+
* Added possibility to check on `:priority` in test helper methods
|
19
|
+
`assert_enqueued_with` and `assert_performed_with`.
|
205
20
|
|
206
|
-
|
21
|
+
*Wojciech Wnętrzak*
|
207
22
|
|
208
|
-
|
209
|
-
class MyJob < ApplicationJob
|
210
|
-
before_enqueue { throw(:abort) }
|
211
|
-
end
|
23
|
+
* OpenSSL constants are now used for Digest computations.
|
212
24
|
|
213
|
-
|
214
|
-
```
|
25
|
+
*Dirkjan Bussink*
|
215
26
|
|
216
|
-
|
217
|
-
because an exception happened during enqueuing. (i.e. Redis is down when you try to enqueue your job)
|
27
|
+
* Add a Serializer for the Range class.
|
218
28
|
|
219
|
-
|
29
|
+
This should allow things like `MyJob.perform_later(range: 1..100)`.
|
220
30
|
|
221
|
-
*
|
31
|
+
* Communicate enqueue failures to callers of `perform_later`.
|
222
32
|
|
223
|
-
|
224
|
-
|
33
|
+
`perform_later` can now optionally take a block which will execute after
|
34
|
+
the adapter attempts to enqueue the job. The block will receive the job
|
35
|
+
instance as an argument even if the enqueue was not successful.
|
36
|
+
Additionally, `ActiveJob` adapters now have the ability to raise an
|
37
|
+
`ActiveJob::EnqueueError` which will be caught and stored in the job
|
38
|
+
instance so code attempting to enqueue jobs can inspect any raised
|
39
|
+
`EnqueueError` using the block.
|
225
40
|
|
226
|
-
|
41
|
+
MyJob.perform_later do |job|
|
42
|
+
unless job.successfully_enqueued?
|
43
|
+
if job.enqueue_error&.message == "Redis was unavailable"
|
44
|
+
# invoke some code that will retry the job after a delay
|
45
|
+
end
|
227
46
|
end
|
228
47
|
end
|
229
48
|
|
230
|
-
|
231
|
-
to not put the sensitive argument in the logs.
|
232
|
-
|
233
|
-
*Rafael Mendonça França*
|
234
|
-
|
235
|
-
* Changes in `queue_name_prefix` of a job no longer affects all other jobs.
|
236
|
-
|
237
|
-
Fixes #37084.
|
238
|
-
|
239
|
-
*Lucas Mansur*
|
240
|
-
|
241
|
-
* Allow `Class` and `Module` instances to be serialized.
|
242
|
-
|
243
|
-
*Kevin Deisz*
|
244
|
-
|
245
|
-
* Log potential matches in `assert_enqueued_with` and `assert_performed_with`.
|
246
|
-
|
247
|
-
*Gareth du Plooy*
|
248
|
-
|
249
|
-
* Add `at` argument to the `perform_enqueued_jobs` test helper.
|
250
|
-
|
251
|
-
*John Crepezzi*, *Eileen Uchitelle*
|
252
|
-
|
253
|
-
* `assert_enqueued_with` and `assert_performed_with` can now test jobs with relative delay.
|
254
|
-
|
255
|
-
*Vlado Cingel*
|
49
|
+
*Daniel Morton*
|
256
50
|
|
257
|
-
*
|
51
|
+
* Don't log rescuable exceptions defined with `rescue_from`.
|
258
52
|
|
259
|
-
|
260
|
-
prevent the [thundering herd effect](https://en.wikipedia.org/wiki/Thundering_herd_problem). Defaults to
|
261
|
-
15% (represented as 0.15) but overridable via the `:jitter` option when using `retry_on`.
|
262
|
-
Jitter is applied when an `Integer`, `ActiveSupport::Duration` or `:exponentially_longer`, is passed to the `wait` argument in `retry_on`.
|
53
|
+
*Hu Hailin*
|
263
54
|
|
264
|
-
|
265
|
-
retry_on(MyError, wait: :exponentially_longer, jitter: 0.30)
|
266
|
-
```
|
55
|
+
* Allow `rescue_from` to rescue all exceptions.
|
267
56
|
|
268
|
-
*
|
57
|
+
*Adrianna Chang*, *Étienne Barrié*
|
269
58
|
|
270
59
|
|
271
|
-
Please check [6-
|
60
|
+
Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activejob/CHANGELOG.md) for previous changes.
|
data/MIT-LICENSE
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2014-
|
1
|
+
Copyright (c) 2014-2021 David Heinemeier Hansson
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
a copy of this software and associated documentation files (the
|
@@ -18,3 +18,4 @@ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
18
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
19
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
20
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
data/README.md
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
Active Job is a framework for declaring jobs and making them run on a variety
|
4
4
|
of queuing backends. These jobs can be everything from regularly scheduled
|
5
|
-
clean-ups, to billing charges, to mailings
|
6
|
-
small units of work and run in parallel
|
5
|
+
clean-ups, to billing charges, to mailings — anything that can be chopped up into
|
6
|
+
small units of work and run in parallel.
|
7
7
|
|
8
8
|
It also serves as the backend for Action Mailer's #deliver_later functionality
|
9
9
|
that makes it easy to turn any mailing into a job for running later. That's
|
10
10
|
one of the most common jobs in a modern web application: sending emails outside
|
11
|
-
|
11
|
+
the request-response cycle, so the user doesn't have to wait on it.
|
12
12
|
|
13
13
|
The main point is to ensure that all Rails apps will have a job infrastructure
|
14
14
|
in place, even if it's in the form of an "immediate runner". We can then have
|
data/lib/active_job/arguments.rb
CHANGED
@@ -7,7 +7,7 @@ module ActiveJob
|
|
7
7
|
#
|
8
8
|
# Wraps the original exception raised as +cause+.
|
9
9
|
class DeserializationError < StandardError
|
10
|
-
def initialize
|
10
|
+
def initialize # :nodoc:
|
11
11
|
super("Error while trying to deserialize arguments: #{$!.message}")
|
12
12
|
set_backtrace $!.backtrace
|
13
13
|
end
|
@@ -17,8 +17,8 @@ module ActiveJob
|
|
17
17
|
# currently support String, Integer, Float, NilClass, TrueClass, FalseClass,
|
18
18
|
# BigDecimal, Symbol, Date, Time, DateTime, ActiveSupport::TimeWithZone,
|
19
19
|
# ActiveSupport::Duration, Hash, ActiveSupport::HashWithIndifferentAccess,
|
20
|
-
# Array or GlobalID::Identification instances, although this can be
|
21
|
-
# by adding custom serializers.
|
20
|
+
# Array, Range or GlobalID::Identification instances, although this can be
|
21
|
+
# extended by adding custom serializers.
|
22
22
|
# Raised if you set the key for a Hash something else than a string or
|
23
23
|
# a symbol. Also raised when trying to serialize an object which can't be
|
24
24
|
# identified with a GlobalID - such as an unpersisted Active Record model.
|
@@ -73,24 +73,19 @@ module ActiveJob
|
|
73
73
|
using Module.new {
|
74
74
|
refine Hash do
|
75
75
|
class << Hash
|
76
|
-
|
77
|
-
|
78
|
-
!new(*[hash]).default.equal?(hash)
|
79
|
-
end
|
80
|
-
else
|
81
|
-
def ruby2_keywords_hash?(hash)
|
82
|
-
false
|
83
|
-
end
|
76
|
+
def ruby2_keywords_hash?(hash)
|
77
|
+
!new(*[hash]).default.equal?(hash)
|
84
78
|
end
|
85
79
|
|
86
80
|
def ruby2_keywords_hash(hash)
|
87
81
|
_ruby2_keywords_hash(**hash)
|
88
82
|
end
|
89
83
|
|
90
|
-
private
|
91
|
-
args
|
92
|
-
|
93
|
-
|
84
|
+
private
|
85
|
+
def _ruby2_keywords_hash(*args)
|
86
|
+
args.last
|
87
|
+
end
|
88
|
+
ruby2_keywords(:_ruby2_keywords_hash)
|
94
89
|
end
|
95
90
|
end
|
96
91
|
}
|
data/lib/active_job/base.rb
CHANGED
@@ -14,7 +14,7 @@ require "active_job/instrumentation"
|
|
14
14
|
require "active_job/timezones"
|
15
15
|
require "active_job/translation"
|
16
16
|
|
17
|
-
module ActiveJob
|
17
|
+
module ActiveJob # :nodoc:
|
18
18
|
# = Active Job
|
19
19
|
#
|
20
20
|
# Active Job objects can be configured to work with different backend
|
@@ -69,8 +69,8 @@ module ActiveJob #:nodoc:
|
|
69
69
|
include Execution
|
70
70
|
include Callbacks
|
71
71
|
include Exceptions
|
72
|
-
include Logging
|
73
72
|
include Instrumentation
|
73
|
+
include Logging
|
74
74
|
include Timezones
|
75
75
|
include Translation
|
76
76
|
|
@@ -1,20 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActiveJob
|
4
|
-
class ConfiguredJob
|
4
|
+
class ConfiguredJob # :nodoc:
|
5
5
|
def initialize(job_class, options = {})
|
6
6
|
@options = options
|
7
7
|
@job_class = job_class
|
8
8
|
end
|
9
9
|
|
10
|
-
def perform_now(
|
11
|
-
@job_class.new(
|
10
|
+
def perform_now(...)
|
11
|
+
@job_class.new(...).perform_now
|
12
12
|
end
|
13
|
-
ruby2_keywords(:perform_now) if respond_to?(:ruby2_keywords, true)
|
14
13
|
|
15
|
-
def perform_later(
|
16
|
-
@job_class.new(
|
14
|
+
def perform_later(...)
|
15
|
+
@job_class.new(...).enqueue @options
|
17
16
|
end
|
18
|
-
ruby2_keywords(:perform_later) if respond_to?(:ruby2_keywords, true)
|
19
17
|
end
|
20
18
|
end
|
data/lib/active_job/core.rb
CHANGED
@@ -43,6 +43,16 @@ module ActiveJob
|
|
43
43
|
# Track when a job was enqueued
|
44
44
|
attr_accessor :enqueued_at
|
45
45
|
|
46
|
+
# Track whether the adapter received the job successfully.
|
47
|
+
attr_writer :successfully_enqueued # :nodoc:
|
48
|
+
|
49
|
+
def successfully_enqueued?
|
50
|
+
@successfully_enqueued
|
51
|
+
end
|
52
|
+
|
53
|
+
# Track any exceptions raised by the backend so callers can inspect the errors.
|
54
|
+
attr_accessor :enqueue_error
|
55
|
+
|
46
56
|
# These methods will be included into any Active Job object, adding
|
47
57
|
# helpers for de/serialization and creation of job instances.
|
48
58
|
module ClassMethods
|
@@ -87,7 +97,7 @@ module ActiveJob
|
|
87
97
|
@exception_executions = {}
|
88
98
|
@timezone = Time.zone&.name
|
89
99
|
end
|
90
|
-
ruby2_keywords(:initialize)
|
100
|
+
ruby2_keywords(:initialize)
|
91
101
|
|
92
102
|
# Returns a hash with the job data that can safely be passed to the
|
93
103
|
# queuing adapter.
|
data/lib/active_job/enqueuing.rb
CHANGED
@@ -4,6 +4,11 @@ require "active_job/arguments"
|
|
4
4
|
|
5
5
|
module ActiveJob
|
6
6
|
# Provides behavior for enqueuing jobs.
|
7
|
+
|
8
|
+
# Can be raised by adapters if they wish to communicate to the caller a reason
|
9
|
+
# why the adapter was unexpectedly unable to enqueue a job.
|
10
|
+
class EnqueueError < StandardError; end
|
11
|
+
|
7
12
|
module Enqueuing
|
8
13
|
extend ActiveSupport::Concern
|
9
14
|
|
@@ -12,22 +17,28 @@ module ActiveJob
|
|
12
17
|
# Push a job onto the queue. By default the arguments must be either String,
|
13
18
|
# Integer, Float, NilClass, TrueClass, FalseClass, BigDecimal, Symbol, Date,
|
14
19
|
# Time, DateTime, ActiveSupport::TimeWithZone, ActiveSupport::Duration,
|
15
|
-
# Hash, ActiveSupport::HashWithIndifferentAccess, Array or
|
20
|
+
# Hash, ActiveSupport::HashWithIndifferentAccess, Array, Range or
|
16
21
|
# GlobalID::Identification instances, although this can be extended by adding
|
17
22
|
# custom serializers.
|
18
23
|
#
|
19
24
|
# Returns an instance of the job class queued with arguments available in
|
20
|
-
# Job#arguments.
|
21
|
-
|
22
|
-
|
25
|
+
# Job#arguments or false if the enqueue did not succeed.
|
26
|
+
#
|
27
|
+
# After the attempted enqueue, the job will be yielded to an optional block.
|
28
|
+
def perform_later(...)
|
29
|
+
job = job_or_instantiate(...)
|
30
|
+
enqueue_result = job.enqueue
|
31
|
+
|
32
|
+
yield job if block_given?
|
33
|
+
|
34
|
+
enqueue_result
|
23
35
|
end
|
24
|
-
ruby2_keywords(:perform_later) if respond_to?(:ruby2_keywords, true)
|
25
36
|
|
26
37
|
private
|
27
38
|
def job_or_instantiate(*args) # :doc:
|
28
39
|
args.first.is_a?(self) ? args.first : new(*args)
|
29
40
|
end
|
30
|
-
ruby2_keywords(:job_or_instantiate)
|
41
|
+
ruby2_keywords(:job_or_instantiate)
|
31
42
|
end
|
32
43
|
|
33
44
|
# Enqueues the job to be performed by the queue adapter.
|
@@ -50,7 +61,7 @@ module ActiveJob
|
|
50
61
|
self.scheduled_at = options[:wait_until].to_f if options[:wait_until]
|
51
62
|
self.queue_name = self.class.queue_name_from_part(options[:queue]) if options[:queue]
|
52
63
|
self.priority = options[:priority].to_i if options[:priority]
|
53
|
-
successfully_enqueued = false
|
64
|
+
self.successfully_enqueued = false
|
54
65
|
|
55
66
|
run_callbacks :enqueue do
|
56
67
|
if scheduled_at
|
@@ -59,10 +70,12 @@ module ActiveJob
|
|
59
70
|
queue_adapter.enqueue self
|
60
71
|
end
|
61
72
|
|
62
|
-
successfully_enqueued = true
|
73
|
+
self.successfully_enqueued = true
|
74
|
+
rescue EnqueueError => e
|
75
|
+
self.enqueue_error = e
|
63
76
|
end
|
64
77
|
|
65
|
-
if successfully_enqueued
|
78
|
+
if successfully_enqueued?
|
66
79
|
self
|
67
80
|
else
|
68
81
|
false
|
@@ -25,7 +25,8 @@ module ActiveJob
|
|
25
25
|
# as a computing proc that takes the number of executions so far as an argument, or as a symbol reference of
|
26
26
|
# <tt>:exponentially_longer</tt>, which applies the wait algorithm of <tt>((executions**4) + (Kernel.rand * (executions**4) * jitter)) + 2</tt>
|
27
27
|
# (first wait ~3s, then ~18s, then ~83s, etc)
|
28
|
-
# * <tt>:attempts</tt> - Re-enqueues the job the specified number of times (default: 5 attempts)
|
28
|
+
# * <tt>:attempts</tt> - Re-enqueues the job the specified number of times (default: 5 attempts) or a symbol reference of <tt>:unlimited</tt>
|
29
|
+
# to retry the job until it succeeds
|
29
30
|
# * <tt>:queue</tt> - Re-enqueues the job on a different queue
|
30
31
|
# * <tt>:priority</tt> - Re-enqueues the job with a different priority
|
31
32
|
# * <tt>:jitter</tt> - A random delay of wait time used when calculating backoff. The default is 15% (0.15) which represents the upper bound of possible wait time (expressed as a percentage)
|
@@ -35,6 +36,7 @@ module ActiveJob
|
|
35
36
|
# class RemoteServiceJob < ActiveJob::Base
|
36
37
|
# retry_on CustomAppException # defaults to ~3s wait, 5 attempts
|
37
38
|
# retry_on AnotherCustomAppException, wait: ->(executions) { executions * 2 }
|
39
|
+
# retry_on CustomInfrastructureException, wait: 5.minutes, attempts: :unlimited
|
38
40
|
#
|
39
41
|
# retry_on ActiveRecord::Deadlocked, wait: 5.seconds, attempts: 3
|
40
42
|
# retry_on Net::OpenTimeout, Timeout::Error, wait: :exponentially_longer, attempts: 10 # retries at most 10 times for Net::OpenTimeout and Timeout::Error combined
|
@@ -56,7 +58,7 @@ module ActiveJob
|
|
56
58
|
def retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil, jitter: JITTER_DEFAULT)
|
57
59
|
rescue_from(*exceptions) do |error|
|
58
60
|
executions = executions_for(exceptions)
|
59
|
-
if executions < attempts
|
61
|
+
if attempts == :unlimited || executions < attempts
|
60
62
|
retry_job wait: determine_delay(seconds_or_duration_or_algorithm: wait, executions: executions, jitter: jitter), queue: queue, priority: priority, error: error
|
61
63
|
else
|
62
64
|
if block_given?
|
data/lib/active_job/execution.rb
CHANGED
@@ -14,12 +14,11 @@ module ActiveJob
|
|
14
14
|
#
|
15
15
|
# MyJob.perform_now("mike")
|
16
16
|
#
|
17
|
-
def perform_now(
|
18
|
-
job_or_instantiate(
|
17
|
+
def perform_now(...)
|
18
|
+
job_or_instantiate(...).perform_now
|
19
19
|
end
|
20
|
-
ruby2_keywords(:perform_now) if respond_to?(:ruby2_keywords, true)
|
21
20
|
|
22
|
-
def execute(job_data)
|
21
|
+
def execute(job_data) # :nodoc:
|
23
22
|
ActiveJob::Callbacks.run_callbacks(:execute) do
|
24
23
|
job = deserialize(job_data)
|
25
24
|
job.perform_now
|
@@ -44,15 +43,20 @@ module ActiveJob
|
|
44
43
|
|
45
44
|
deserialize_arguments_if_needed
|
46
45
|
|
47
|
-
|
48
|
-
|
49
|
-
end
|
50
|
-
rescue => exception
|
46
|
+
_perform_job
|
47
|
+
rescue Exception => exception
|
51
48
|
rescue_with_handler(exception) || raise
|
52
49
|
end
|
53
50
|
|
54
51
|
def perform(*)
|
55
52
|
fail NotImplementedError
|
56
53
|
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def _perform_job
|
57
|
+
run_callbacks :perform do
|
58
|
+
perform(*arguments)
|
59
|
+
end
|
60
|
+
end
|
57
61
|
end
|
58
62
|
end
|
@@ -1,21 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActiveJob
|
4
|
-
module Instrumentation
|
4
|
+
module Instrumentation # :nodoc:
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
included do
|
8
8
|
around_enqueue do |_, block|
|
9
9
|
scheduled_at ? instrument(:enqueue_at, &block) : instrument(:enqueue, &block)
|
10
10
|
end
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
instrument :perform, &block
|
15
|
-
end
|
13
|
+
def perform_now
|
14
|
+
instrument(:perform) { super }
|
16
15
|
end
|
17
16
|
|
18
17
|
private
|
18
|
+
def _perform_job
|
19
|
+
instrument(:perform_start)
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
19
23
|
def instrument(operation, payload = {}, &block)
|
20
24
|
enhanced_block = ->(event_payload) do
|
21
25
|
value = block.call if block
|
@@ -4,7 +4,7 @@ require "active_support/core_ext/string/filters"
|
|
4
4
|
require "active_support/log_subscriber"
|
5
5
|
|
6
6
|
module ActiveJob
|
7
|
-
class LogSubscriber < ActiveSupport::LogSubscriber
|
7
|
+
class LogSubscriber < ActiveSupport::LogSubscriber # :nodoc:
|
8
8
|
def enqueue(event)
|
9
9
|
job = event.payload[:job]
|
10
10
|
ex = event.payload[:exception_object]
|