activejob 7.0.7.2 → 7.1.0.beta1
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 +119 -149
- data/MIT-LICENSE +1 -1
- data/README.md +2 -2
- data/lib/active_job/arguments.rb +14 -25
- data/lib/active_job/base.rb +1 -1
- data/lib/active_job/callbacks.rb +1 -4
- data/lib/active_job/configured_job.rb +4 -0
- data/lib/active_job/core.rb +3 -1
- data/lib/active_job/deprecator.rb +7 -0
- data/lib/active_job/enqueuing.rb +30 -0
- data/lib/active_job/exceptions.rb +30 -0
- data/lib/active_job/execution.rb +5 -1
- data/lib/active_job/gem_version.rb +4 -4
- data/lib/active_job/instrumentation.rb +18 -10
- data/lib/active_job/log_subscriber.rb +78 -8
- data/lib/active_job/queue_adapter.rb +13 -2
- data/lib/active_job/queue_adapters/async_adapter.rb +2 -2
- data/lib/active_job/queue_adapters/backburner_adapter.rb +7 -3
- data/lib/active_job/queue_adapters/delayed_job_adapter.rb +1 -1
- data/lib/active_job/queue_adapters/inline_adapter.rb +1 -1
- data/lib/active_job/queue_adapters/queue_classic_adapter.rb +4 -4
- data/lib/active_job/queue_adapters/resque_adapter.rb +1 -1
- data/lib/active_job/queue_adapters/sidekiq_adapter.rb +42 -14
- data/lib/active_job/queue_adapters/sneakers_adapter.rb +1 -1
- data/lib/active_job/queue_adapters/sucker_punch_adapter.rb +2 -2
- data/lib/active_job/queue_adapters/test_adapter.rb +2 -2
- data/lib/active_job/queue_adapters.rb +8 -7
- data/lib/active_job/queue_priority.rb +18 -1
- data/lib/active_job/railtie.rb +25 -6
- data/lib/active_job/serializers/big_decimal_serializer.rb +22 -0
- data/lib/active_job/serializers/duration_serializer.rb +4 -2
- data/lib/active_job/serializers.rb +7 -3
- data/lib/active_job/test_helper.rb +23 -3
- data/lib/active_job/version.rb +1 -1
- data/lib/active_job.rb +26 -4
- data/lib/rails/generators/job/USAGE +19 -0
- data/lib/rails/generators/job/job_generator.rb +6 -2
- data/lib/rails/generators/job/templates/job.rb.tt +1 -1
- metadata +13 -11
- data/lib/active_job/queue_adapters/que_adapter.rb +0 -61
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c483058510bace1163414149c1aff4177dd5dc026414417a99f240128686ccc6
|
4
|
+
data.tar.gz: 27f14766eafe75eb955ebae328ef1c154c3bd3aa42251403e6ced8a61f8dc3d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eeb8e50e581068b1e9862917d02d99bc8988fc254475e4a70a4a7e231ccb61340dfa276be6d39d0f6ebd4f347a00019d3c3703c946549bb4788dcdd83b46ccc9
|
7
|
+
data.tar.gz: 23cb3701834db4e4b6ba5adbd77966a50bd0debf8aed7a75d9a83f04355895aad870baca894d6e32183757b9a4a7f62c79748a638f99928be4c497d633302cb5
|
data/CHANGELOG.md
CHANGED
@@ -1,108 +1,178 @@
|
|
1
|
-
## Rails 7.0.
|
1
|
+
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
2
2
|
|
3
|
-
*
|
3
|
+
* Fix Active Job log message to correctly report a job failed to enqueue
|
4
|
+
when the adapter raises an `ActiveJob::EnqueueError`.
|
4
5
|
|
6
|
+
*Ben Sheldon*
|
5
7
|
|
6
|
-
|
8
|
+
* Add `after_discard` method.
|
7
9
|
|
8
|
-
|
10
|
+
This method lets job authors define a block which will be run when a job is about to be discarded. For example:
|
9
11
|
|
12
|
+
```ruby
|
13
|
+
class AfterDiscardJob < ActiveJob::Base
|
14
|
+
after_discard do |job, exception|
|
15
|
+
Rails.logger.info("#{job.class} raised an exception: #{exception}")
|
16
|
+
end
|
10
17
|
|
11
|
-
|
18
|
+
def perform
|
19
|
+
raise StandardError
|
20
|
+
end
|
21
|
+
end
|
22
|
+
```
|
12
23
|
|
13
|
-
|
24
|
+
The above job will run the block passed to `after_discard` after the job is discarded. The exception will
|
25
|
+
still be raised after the block has been run.
|
14
26
|
|
27
|
+
*Rob Cardy*
|
15
28
|
|
16
|
-
|
29
|
+
* Fix deserialization of ActiveSupport::Duration
|
17
30
|
|
18
|
-
|
31
|
+
Previously, a deserialized Duration would return an array from Duration#parts.
|
32
|
+
It will now return a hash just like a regular Duration.
|
19
33
|
|
20
|
-
|
34
|
+
This also fixes an error when trying to add or subtract from a deserialized Duration
|
35
|
+
(eg `duration + 1.year`).
|
21
36
|
|
37
|
+
*Jonathan del Strother*
|
22
38
|
|
23
|
-
|
39
|
+
* `perform_enqueued_jobs` is now compatible with all Active Job adapters
|
24
40
|
|
25
|
-
|
41
|
+
This means that methods that depend on it, like Action Mailer's `assert_emails`,
|
42
|
+
will work correctly even if the test adapter is not used.
|
26
43
|
|
44
|
+
*Alex Ghiculescu*
|
27
45
|
|
28
|
-
|
46
|
+
* Allow queue adapters to provide a custom name by implementing `queue_adapter_name`
|
29
47
|
|
30
|
-
*
|
48
|
+
*Sander Verdonschot*
|
31
49
|
|
32
|
-
|
50
|
+
* Log background job enqueue callers
|
33
51
|
|
34
|
-
|
52
|
+
Add `verbose_enqueue_logs` configuration option to display the caller
|
53
|
+
of background job enqueue in the log to help with debugging.
|
35
54
|
|
36
|
-
|
37
|
-
`:job`, the job name would get logged twice. This bug has been fixed.
|
55
|
+
Example log line:
|
38
56
|
|
39
|
-
|
57
|
+
```
|
58
|
+
Enqueued AvatarThumbnailsJob (Job ID: ab528951-41fb-4c48-9129-3171791c27d6) to Sidekiq(default) with arguments: 1092412064
|
59
|
+
↳ app/models/user.rb:421:in `generate_avatar_thumbnails'
|
60
|
+
```
|
40
61
|
|
62
|
+
Enabled in development only for new and upgraded applications. Not recommended for use
|
63
|
+
in the production environment since it relies on Ruby's `Kernel#caller` which is fairly slow.
|
41
64
|
|
42
|
-
|
65
|
+
*fatkodima*
|
43
66
|
|
44
|
-
*
|
67
|
+
* Set `provider_job_id` for Backburner jobs
|
45
68
|
|
69
|
+
*Cameron Matheson*
|
46
70
|
|
47
|
-
|
71
|
+
* Add `perform_all_later` to enqueue multiple jobs at once
|
48
72
|
|
49
|
-
|
73
|
+
This adds the ability to bulk enqueue jobs, without running callbacks, by
|
74
|
+
passing multiple jobs or an array of jobs. For example:
|
50
75
|
|
76
|
+
```ruby
|
77
|
+
ActiveJob.perform_all_later(MyJob.new("hello", 42), MyJob.new("world", 0))
|
51
78
|
|
52
|
-
|
79
|
+
user_jobs = User.pluck(:id).map { |id| UserJob.new(user_id: id) }
|
80
|
+
ActiveJob.perform_all_later(user_jobs)
|
81
|
+
```
|
53
82
|
|
54
|
-
|
83
|
+
This can greatly reduce the number of round-trips to the queue datastore.
|
84
|
+
For queue adapters that do not implement the new `enqueue_all` method, we
|
85
|
+
fall back to enqueuing jobs individually. The Sidekiq adapter implements
|
86
|
+
`enqueue_all` with `push_bulk`.
|
55
87
|
|
88
|
+
This method does not use the existing `enqueue.active_job` event, but adds a
|
89
|
+
new event `enqueue_all.active_job`.
|
56
90
|
|
57
|
-
|
91
|
+
*Sander Verdonschot*
|
58
92
|
|
59
|
-
*
|
93
|
+
* Don't double log the `job` when using `ActiveRecord::QueryLog`
|
60
94
|
|
61
|
-
|
62
|
-
|
95
|
+
Previously if you set `config.active_record.query_log_tags` to an array that included
|
96
|
+
`:job`, the job name would get logged twice. This bug has been fixed.
|
63
97
|
|
64
|
-
*
|
98
|
+
*Alex Ghiculescu*
|
65
99
|
|
66
|
-
|
100
|
+
* Add support for Sidekiq's transaction-aware client
|
67
101
|
|
68
|
-
*
|
102
|
+
*Jonathan del Strother*
|
69
103
|
|
104
|
+
* Remove QueAdapter from Active Job.
|
70
105
|
|
71
|
-
|
106
|
+
After maintaining Active Job QueAdapter by Rails and Que side
|
107
|
+
to support Ruby 3 keyword arguments and options provided as top level keywords,
|
108
|
+
it is quite difficult to maintain it this way.
|
72
109
|
|
73
|
-
|
110
|
+
Active Job Que adapter can be included in the future version of que gem itself.
|
74
111
|
|
75
|
-
|
76
|
-
when loading Active Job in isolation.
|
112
|
+
*Yasuo Honda*
|
77
113
|
|
78
|
-
|
114
|
+
* Fix BigDecimal (de)serialization for adapters using JSON.
|
115
|
+
|
116
|
+
Previously, BigDecimal was listed as not needing a serializer. However,
|
117
|
+
when used with an adapter storing the job arguments as JSON, it would get
|
118
|
+
serialized as a simple String, resulting in deserialization also producing
|
119
|
+
a String (instead of a BigDecimal).
|
120
|
+
|
121
|
+
By using a serializer, we ensure the round trip is safe.
|
79
122
|
|
80
|
-
|
123
|
+
To ensure applications using BigDecimal job arguments are not subject to
|
124
|
+
race conditions during deployment (where a replica running a version of
|
125
|
+
Rails without BigDecimalSerializer fails to deserialize an argument
|
126
|
+
serialized with it), `ActiveJob.use_big_decimal_serializer` is disabled by
|
127
|
+
default, and can be set to true in a following deployment..
|
81
128
|
|
82
|
-
*
|
129
|
+
*Sam Bostock*
|
83
130
|
|
131
|
+
* Preserve full-precision `enqueued_at` timestamps for serialized jobs,
|
132
|
+
allowing more accurate reporting of how long a job spent waiting in the
|
133
|
+
queue before it was performed.
|
134
|
+
|
135
|
+
Retains IS08601 format compatibility.
|
136
|
+
|
137
|
+
*Jeremy Daer*
|
138
|
+
|
139
|
+
* Add `--parent` option to job generator to specify parent class of job.
|
140
|
+
|
141
|
+
Example:
|
84
142
|
|
85
|
-
|
143
|
+
`bin/rails g job process_payment --parent=payment_job` generates:
|
86
144
|
|
87
|
-
|
145
|
+
```ruby
|
146
|
+
class ProcessPaymentJob < PaymentJob
|
147
|
+
# ...
|
148
|
+
end
|
149
|
+
```
|
88
150
|
|
151
|
+
*Gannon McGibbon*
|
89
152
|
|
90
|
-
|
153
|
+
* Add more detailed description to job generator.
|
91
154
|
|
92
|
-
*
|
155
|
+
*Gannon McGibbon*
|
93
156
|
|
157
|
+
* `perform.active_job` notification payloads now include `:db_runtime`, which
|
158
|
+
is the total time (in ms) taken by database queries while performing a job.
|
159
|
+
This value can be used to better understand how a job's time is spent.
|
94
160
|
|
95
|
-
|
161
|
+
*Jonathan Hefner*
|
96
162
|
|
97
|
-
*
|
163
|
+
* Update `ActiveJob::QueueAdapters::QueAdapter` to remove deprecation warning.
|
98
164
|
|
165
|
+
Remove a deprecation warning introduced in que 1.2 to prepare for changes in
|
166
|
+
que 2.0 necessary for Ruby 3 compatibility.
|
99
167
|
|
100
|
-
|
168
|
+
*Damir Zekic* and *Adis Hasovic*
|
101
169
|
|
102
|
-
*
|
170
|
+
* Add missing `bigdecimal` require in `ActiveJob::Arguments`
|
103
171
|
|
172
|
+
Could cause `uninitialized constant ActiveJob::Arguments::BigDecimal (NameError)`
|
173
|
+
when loading Active Job in isolation.
|
104
174
|
|
105
|
-
|
175
|
+
*Jean Boussier*
|
106
176
|
|
107
177
|
* Allow testing `discard_on/retry_on ActiveJob::DeserializationError`
|
108
178
|
|
@@ -110,7 +180,7 @@
|
|
110
180
|
was called before calling `perform_now`. When a record no longer exists
|
111
181
|
and is serialized using GlobalID this led to raising
|
112
182
|
an `ActiveJob::DeserializationError` before reaching `perform_now` call.
|
113
|
-
This
|
183
|
+
This behavior makes difficult testing the job `discard_on/retry_on` logic.
|
114
184
|
|
115
185
|
Now `deserialize_arguments_if_needed` call is postponed to when `perform_now`
|
116
186
|
is called.
|
@@ -135,104 +205,4 @@
|
|
135
205
|
|
136
206
|
*Jacopo Beschi*
|
137
207
|
|
138
|
-
|
139
|
-
## Rails 7.0.0 (December 15, 2021) ##
|
140
|
-
|
141
|
-
* No changes.
|
142
|
-
|
143
|
-
|
144
|
-
## Rails 7.0.0.rc3 (December 14, 2021) ##
|
145
|
-
|
146
|
-
* No changes.
|
147
|
-
|
148
|
-
|
149
|
-
## Rails 7.0.0.rc2 (December 14, 2021) ##
|
150
|
-
|
151
|
-
* No changes.
|
152
|
-
|
153
|
-
## Rails 7.0.0.rc1 (December 06, 2021) ##
|
154
|
-
|
155
|
-
* Remove deprecated `:return_false_on_aborted_enqueue` option.
|
156
|
-
|
157
|
-
*Rafael Mendonça França*
|
158
|
-
|
159
|
-
* Deprecated `Rails.config.active_job.skip_after_callbacks_if_terminated`.
|
160
|
-
|
161
|
-
*Rafael Mendonça França*
|
162
|
-
|
163
|
-
* Removed deprecated behavior that was not halting `after_enqueue`/`after_perform` callbacks when a
|
164
|
-
previous callback was halted with `throw :abort`.
|
165
|
-
|
166
|
-
*Rafael Mendonça França*
|
167
|
-
|
168
|
-
* Raise an `SerializationError` in `Serializer::ModuleSerializer`
|
169
|
-
if the module name is not present.
|
170
|
-
|
171
|
-
*Veerpal Brar*
|
172
|
-
|
173
|
-
|
174
|
-
## Rails 7.0.0.alpha2 (September 15, 2021) ##
|
175
|
-
|
176
|
-
* No changes.
|
177
|
-
|
178
|
-
|
179
|
-
## Rails 7.0.0.alpha1 (September 15, 2021) ##
|
180
|
-
|
181
|
-
* Allow a job to retry indefinitely
|
182
|
-
|
183
|
-
The `attempts` parameter of the `retry_on` method now accepts the
|
184
|
-
symbol reference `:unlimited` in addition to a specific number of retry
|
185
|
-
attempts to allow a developer to specify that a job should retry
|
186
|
-
forever until it succeeds.
|
187
|
-
|
188
|
-
class MyJob < ActiveJob::Base
|
189
|
-
retry_on(AlwaysRetryException, attempts: :unlimited)
|
190
|
-
|
191
|
-
# the actual job code
|
192
|
-
end
|
193
|
-
|
194
|
-
*Daniel Morton*
|
195
|
-
|
196
|
-
* Added possibility to check on `:priority` in test helper methods
|
197
|
-
`assert_enqueued_with` and `assert_performed_with`.
|
198
|
-
|
199
|
-
*Wojciech Wnętrzak*
|
200
|
-
|
201
|
-
* OpenSSL constants are now used for Digest computations.
|
202
|
-
|
203
|
-
*Dirkjan Bussink*
|
204
|
-
|
205
|
-
* Add a Serializer for the Range class.
|
206
|
-
|
207
|
-
This should allow things like `MyJob.perform_later(range: 1..100)`.
|
208
|
-
|
209
|
-
* Communicate enqueue failures to callers of `perform_later`.
|
210
|
-
|
211
|
-
`perform_later` can now optionally take a block which will execute after
|
212
|
-
the adapter attempts to enqueue the job. The block will receive the job
|
213
|
-
instance as an argument even if the enqueue was not successful.
|
214
|
-
Additionally, `ActiveJob` adapters now have the ability to raise an
|
215
|
-
`ActiveJob::EnqueueError` which will be caught and stored in the job
|
216
|
-
instance so code attempting to enqueue jobs can inspect any raised
|
217
|
-
`EnqueueError` using the block.
|
218
|
-
|
219
|
-
MyJob.perform_later do |job|
|
220
|
-
unless job.successfully_enqueued?
|
221
|
-
if job.enqueue_error&.message == "Redis was unavailable"
|
222
|
-
# invoke some code that will retry the job after a delay
|
223
|
-
end
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
*Daniel Morton*
|
228
|
-
|
229
|
-
* Don't log rescuable exceptions defined with `rescue_from`.
|
230
|
-
|
231
|
-
*Hu Hailin*
|
232
|
-
|
233
|
-
* Allow `rescue_from` to rescue all exceptions.
|
234
|
-
|
235
|
-
*Adrianna Chang*, *Étienne Barrié*
|
236
|
-
|
237
|
-
|
238
|
-
Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activejob/CHANGELOG.md) for previous changes.
|
208
|
+
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/activejob/CHANGELOG.md) for previous changes.
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -10,14 +10,14 @@ 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
|
-
The main point is to ensure that all Rails apps will have a job infrastructure
|
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
|
15
15
|
framework features and other gems build on top of that, without having to worry
|
16
16
|
about API differences between Delayed Job and Resque. Picking your queuing
|
17
17
|
backend becomes more of an operational concern, then. And you'll be able to
|
18
18
|
switch between them without having to rewrite your jobs.
|
19
19
|
|
20
|
-
You can read more about Active Job in the [Active Job Basics](https://
|
20
|
+
You can read more about Active Job in the [Active Job Basics](https://guides.rubyonrails.org/active_job_basics.html) guide.
|
21
21
|
|
22
22
|
## Usage
|
23
23
|
|
data/lib/active_job/arguments.rb
CHANGED
@@ -47,7 +47,7 @@ module ActiveJob
|
|
47
47
|
|
48
48
|
private
|
49
49
|
# :nodoc:
|
50
|
-
PERMITTED_TYPES = [ NilClass, String, Integer, Float,
|
50
|
+
PERMITTED_TYPES = [ NilClass, String, Integer, Float, TrueClass, FalseClass ]
|
51
51
|
# :nodoc:
|
52
52
|
GLOBALID_KEY = "_aj_globalid"
|
53
53
|
# :nodoc:
|
@@ -70,28 +70,6 @@ module ActiveJob
|
|
70
70
|
private_constant :PERMITTED_TYPES, :RESERVED_KEYS, :GLOBALID_KEY,
|
71
71
|
:SYMBOL_KEYS_KEY, :RUBY2_KEYWORDS_KEY, :WITH_INDIFFERENT_ACCESS_KEY
|
72
72
|
|
73
|
-
unless Hash.respond_to?(:ruby2_keywords_hash?) && Hash.respond_to?(:ruby2_keywords_hash)
|
74
|
-
using Module.new {
|
75
|
-
refine Hash do
|
76
|
-
class << Hash
|
77
|
-
def ruby2_keywords_hash?(hash)
|
78
|
-
!new(*[hash]).default.equal?(hash)
|
79
|
-
end
|
80
|
-
|
81
|
-
def ruby2_keywords_hash(hash)
|
82
|
-
_ruby2_keywords_hash(**hash)
|
83
|
-
end
|
84
|
-
|
85
|
-
private
|
86
|
-
def _ruby2_keywords_hash(*args)
|
87
|
-
args.last
|
88
|
-
end
|
89
|
-
ruby2_keywords(:_ruby2_keywords_hash)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
}
|
93
|
-
end
|
94
|
-
|
95
73
|
def serialize_argument(argument)
|
96
74
|
case argument
|
97
75
|
when *PERMITTED_TYPES
|
@@ -115,16 +93,27 @@ module ActiveJob
|
|
115
93
|
when -> (arg) { arg.respond_to?(:permitted?) && arg.respond_to?(:to_h) }
|
116
94
|
serialize_indifferent_hash(argument.to_h)
|
117
95
|
else
|
96
|
+
if BigDecimal === argument && !ActiveJob.use_big_decimal_serializer
|
97
|
+
ActiveJob.deprecator.warn(<<~MSG)
|
98
|
+
Primitive serialization of BigDecimal job arguments is deprecated as it may serialize via .to_s using certain queue adapters.
|
99
|
+
Enable config.active_job.use_big_decimal_serializer to use BigDecimalSerializer instead, which will be mandatory in Rails 7.2.
|
100
|
+
|
101
|
+
Note that if you application has multiple replicas, you should only enable this setting after successfully deploying your app to Rails 7.1 first.
|
102
|
+
This will ensure that during your deployment all replicas are capable of deserializing arguments serialized with BigDecimalSerializer.
|
103
|
+
MSG
|
104
|
+
return argument
|
105
|
+
end
|
106
|
+
|
118
107
|
Serializers.serialize(argument)
|
119
108
|
end
|
120
109
|
end
|
121
110
|
|
122
111
|
def deserialize_argument(argument)
|
123
112
|
case argument
|
124
|
-
when String
|
125
|
-
argument
|
126
113
|
when *PERMITTED_TYPES
|
127
114
|
argument
|
115
|
+
when BigDecimal # BigDecimal may have been legacy serialized; Remove in 7.2
|
116
|
+
argument
|
128
117
|
when Array
|
129
118
|
argument.map { |arg| deserialize_argument(arg) }
|
130
119
|
when Hash
|
data/lib/active_job/base.rb
CHANGED
@@ -15,7 +15,7 @@ require "active_job/timezones"
|
|
15
15
|
require "active_job/translation"
|
16
16
|
|
17
17
|
module ActiveJob # :nodoc:
|
18
|
-
# = Active Job
|
18
|
+
# = Active Job \Base
|
19
19
|
#
|
20
20
|
# Active Job objects can be configured to work with different backend
|
21
21
|
# queuing frameworks. To specify a queue adapter to use:
|
data/lib/active_job/callbacks.rb
CHANGED
@@ -4,7 +4,7 @@ require "active_support/callbacks"
|
|
4
4
|
require "active_support/core_ext/module/attribute_accessors"
|
5
5
|
|
6
6
|
module ActiveJob
|
7
|
-
# = Active Job Callbacks
|
7
|
+
# = Active Job \Callbacks
|
8
8
|
#
|
9
9
|
# Active Job provides hooks during the life cycle of a job. Callbacks allow you
|
10
10
|
# to trigger logic during this cycle. Available callbacks are:
|
@@ -28,9 +28,6 @@ module ActiveJob
|
|
28
28
|
end
|
29
29
|
|
30
30
|
included do
|
31
|
-
cattr_accessor :skip_after_callbacks_if_terminated, instance_accessor: false, default: false
|
32
|
-
singleton_class.deprecate :skip_after_callbacks_if_terminated, :skip_after_callbacks_if_terminated=
|
33
|
-
|
34
31
|
define_callbacks :perform, skip_after_callbacks_if_terminated: true
|
35
32
|
define_callbacks :enqueue, skip_after_callbacks_if_terminated: true
|
36
33
|
end
|
data/lib/active_job/core.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActiveJob
|
4
|
+
# = Active Job \Core
|
5
|
+
#
|
4
6
|
# Provides general behavior that will be included into every Active Job
|
5
7
|
# object that inherits from ActiveJob::Base.
|
6
8
|
module Core
|
@@ -113,7 +115,7 @@ module ActiveJob
|
|
113
115
|
"exception_executions" => exception_executions,
|
114
116
|
"locale" => I18n.locale.to_s,
|
115
117
|
"timezone" => timezone,
|
116
|
-
"enqueued_at" => Time.now.utc.iso8601
|
118
|
+
"enqueued_at" => Time.now.utc.iso8601(9)
|
117
119
|
}
|
118
120
|
end
|
119
121
|
|
data/lib/active_job/enqueuing.rb
CHANGED
@@ -9,6 +9,36 @@ module ActiveJob
|
|
9
9
|
# why the adapter was unexpectedly unable to enqueue a job.
|
10
10
|
class EnqueueError < StandardError; end
|
11
11
|
|
12
|
+
class << self
|
13
|
+
# Push many jobs onto the queue at once without running enqueue callbacks.
|
14
|
+
# Queue adapters may communicate the enqueue status of each job by setting
|
15
|
+
# successfully_enqueued and/or enqueue_error on the passed-in job instances.
|
16
|
+
def perform_all_later(*jobs)
|
17
|
+
jobs.flatten!
|
18
|
+
jobs.group_by(&:queue_adapter).each do |queue_adapter, adapter_jobs|
|
19
|
+
instrument_enqueue_all(queue_adapter, adapter_jobs) do
|
20
|
+
if queue_adapter.respond_to?(:enqueue_all)
|
21
|
+
queue_adapter.enqueue_all(adapter_jobs)
|
22
|
+
else
|
23
|
+
adapter_jobs.each do |job|
|
24
|
+
job.successfully_enqueued = false
|
25
|
+
if job.scheduled_at
|
26
|
+
queue_adapter.enqueue_at(job, job.scheduled_at)
|
27
|
+
else
|
28
|
+
queue_adapter.enqueue(job)
|
29
|
+
end
|
30
|
+
job.successfully_enqueued = true
|
31
|
+
rescue EnqueueError => e
|
32
|
+
job.enqueue_error = e
|
33
|
+
end
|
34
|
+
adapter_jobs.count(&:successfully_enqueued?)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
12
42
|
module Enqueuing
|
13
43
|
extend ActiveSupport::Concern
|
14
44
|
|
@@ -9,6 +9,7 @@ module ActiveJob
|
|
9
9
|
|
10
10
|
included do
|
11
11
|
class_attribute :retry_jitter, instance_accessor: false, instance_predicate: false, default: 0.0
|
12
|
+
class_attribute :after_discard_procs, default: []
|
12
13
|
end
|
13
14
|
|
14
15
|
module ClassMethods
|
@@ -65,8 +66,10 @@ module ActiveJob
|
|
65
66
|
instrument :retry_stopped, error: error do
|
66
67
|
yield self, error
|
67
68
|
end
|
69
|
+
run_after_discard_procs(error)
|
68
70
|
else
|
69
71
|
instrument :retry_stopped, error: error
|
72
|
+
run_after_discard_procs(error)
|
70
73
|
raise error
|
71
74
|
end
|
72
75
|
end
|
@@ -95,9 +98,26 @@ module ActiveJob
|
|
95
98
|
rescue_from(*exceptions) do |error|
|
96
99
|
instrument :discard, error: error do
|
97
100
|
yield self, error if block_given?
|
101
|
+
run_after_discard_procs(error)
|
98
102
|
end
|
99
103
|
end
|
100
104
|
end
|
105
|
+
|
106
|
+
# A block to run when a job is about to be discarded for any reason.
|
107
|
+
#
|
108
|
+
# ==== Example
|
109
|
+
#
|
110
|
+
# class WorkJob < ActiveJob::Base
|
111
|
+
# after_discard do |job, exception|
|
112
|
+
# ExceptionNotifier.report(exception)
|
113
|
+
# end
|
114
|
+
#
|
115
|
+
# ...
|
116
|
+
#
|
117
|
+
# end
|
118
|
+
def after_discard(&blk)
|
119
|
+
self.after_discard_procs += [blk]
|
120
|
+
end
|
101
121
|
end
|
102
122
|
|
103
123
|
# Reschedules the job to be re-executed. This is useful in combination with
|
@@ -165,5 +185,15 @@ module ActiveJob
|
|
165
185
|
executions
|
166
186
|
end
|
167
187
|
end
|
188
|
+
|
189
|
+
def run_after_discard_procs(exception)
|
190
|
+
exceptions = []
|
191
|
+
after_discard_procs.each do |blk|
|
192
|
+
instance_exec(self, exception, &blk)
|
193
|
+
rescue StandardError => e
|
194
|
+
exceptions << e
|
195
|
+
end
|
196
|
+
raise exceptions.last unless exceptions.empty?
|
197
|
+
end
|
168
198
|
end
|
169
199
|
end
|
data/lib/active_job/execution.rb
CHANGED
@@ -51,7 +51,11 @@ module ActiveJob
|
|
51
51
|
|
52
52
|
_perform_job
|
53
53
|
rescue Exception => exception
|
54
|
-
rescue_with_handler(exception)
|
54
|
+
handled = rescue_with_handler(exception)
|
55
|
+
return handled if handled
|
56
|
+
|
57
|
+
run_after_discard_procs(exception)
|
58
|
+
raise
|
55
59
|
end
|
56
60
|
|
57
61
|
def perform(*)
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActiveJob
|
4
|
-
# Returns the currently loaded version of Active Job as a
|
4
|
+
# Returns the currently loaded version of Active Job as a +Gem::Version+.
|
5
5
|
def self.gem_version
|
6
6
|
Gem::Version.new VERSION::STRING
|
7
7
|
end
|
8
8
|
|
9
9
|
module VERSION
|
10
10
|
MAJOR = 7
|
11
|
-
MINOR =
|
12
|
-
TINY =
|
13
|
-
PRE = "
|
11
|
+
MINOR = 1
|
12
|
+
TINY = 0
|
13
|
+
PRE = "beta1"
|
14
14
|
|
15
15
|
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
16
16
|
end
|