activejob 7.0.8 → 7.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +147 -150
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +2 -2
  5. data/lib/active_job/arguments.rb +14 -25
  6. data/lib/active_job/base.rb +1 -1
  7. data/lib/active_job/callbacks.rb +1 -4
  8. data/lib/active_job/configured_job.rb +4 -0
  9. data/lib/active_job/core.rb +26 -6
  10. data/lib/active_job/deprecator.rb +7 -0
  11. data/lib/active_job/enqueuing.rb +31 -1
  12. data/lib/active_job/exceptions.rb +48 -5
  13. data/lib/active_job/execution.rb +5 -1
  14. data/lib/active_job/gem_version.rb +3 -3
  15. data/lib/active_job/instrumentation.rb +18 -10
  16. data/lib/active_job/log_subscriber.rb +80 -8
  17. data/lib/active_job/queue_adapter.rb +13 -2
  18. data/lib/active_job/queue_adapters/async_adapter.rb +2 -2
  19. data/lib/active_job/queue_adapters/backburner_adapter.rb +7 -3
  20. data/lib/active_job/queue_adapters/delayed_job_adapter.rb +1 -1
  21. data/lib/active_job/queue_adapters/inline_adapter.rb +1 -1
  22. data/lib/active_job/queue_adapters/queue_classic_adapter.rb +4 -4
  23. data/lib/active_job/queue_adapters/resque_adapter.rb +1 -1
  24. data/lib/active_job/queue_adapters/sidekiq_adapter.rb +42 -14
  25. data/lib/active_job/queue_adapters/sneakers_adapter.rb +1 -1
  26. data/lib/active_job/queue_adapters/sucker_punch_adapter.rb +2 -2
  27. data/lib/active_job/queue_adapters/test_adapter.rb +3 -3
  28. data/lib/active_job/queue_adapters.rb +8 -7
  29. data/lib/active_job/queue_priority.rb +18 -1
  30. data/lib/active_job/railtie.rb +25 -6
  31. data/lib/active_job/serializers/big_decimal_serializer.rb +22 -0
  32. data/lib/active_job/serializers/duration_serializer.rb +4 -2
  33. data/lib/active_job/serializers.rb +7 -3
  34. data/lib/active_job/test_helper.rb +29 -13
  35. data/lib/active_job/version.rb +1 -1
  36. data/lib/active_job.rb +26 -4
  37. data/lib/rails/generators/job/USAGE +19 -0
  38. data/lib/rails/generators/job/job_generator.rb +6 -2
  39. data/lib/rails/generators/job/templates/job.rb.tt +1 -1
  40. metadata +10 -8
  41. 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: 235128c7d980f87db5c8868459c333bd46426236218aae248293461011c39f82
4
- data.tar.gz: d8c90ea58afcb522bb34846a4356dbc4f06063d3edd89b1486bce21d07b0272f
3
+ metadata.gz: ea637a7b6239a6e228de7f98860427f9688184709e48543590f372c8bcd2d57c
4
+ data.tar.gz: e7bc63d30c136ea1d99fd6758b24d82c95757255607171e3dd619c0f53252ed8
5
5
  SHA512:
6
- metadata.gz: de04d283bcec657df1b29faa766d084c95820ef6f0505633484a8e15e6421a8e1313cb2727a9dfc6b09c280f1e4a1533a0673ceb0489ac674834ec0fbbd65bf2
7
- data.tar.gz: 3c9bb2aa0e47b7482a3ec51e25747c0952f457f6770ddbbeaa56b7c6bac137a2046a8df778237fb4a2500b533962711b1d5e0b5efceaff49bb3d2cf725fc4f0b
6
+ metadata.gz: 3eb3f4d04a225659584e7c0b22c71478a3494591b0f8a3ec97f08cfbfc0a8f006929343e0e59cc772b9bed8f5197909ad0712a4065c127d99efdcd43b112d3f1
7
+ data.tar.gz: 25a57f8304b995f9ac2c73313eec271838d381ceb76a11e43787e7ac4cbeeab24c505c325ba43aa9a6aa511e6eaccab1ccbb4070573d0e5642ce18b4daa19056
data/CHANGELOG.md CHANGED
@@ -1,116 +1,213 @@
1
- ## Rails 7.0.8 (September 09, 2023) ##
1
+ ## Rails 7.1.1 (October 11, 2023) ##
2
+
3
+ * Don't log enqueuing details when the job wasn't enqueued.
4
+
5
+ *Dustin Brown*
6
+
7
+
8
+ ## Rails 7.1.0 (October 05, 2023) ##
9
+
10
+ * No changes.
11
+
12
+
13
+ ## Rails 7.1.0.rc2 (October 01, 2023) ##
14
+
15
+ * Make sure `scheduled_at` is a Time object when asserting enqueued jobs.
16
+
17
+ *Rafael Mendonça França*
18
+
19
+
20
+ ## Rails 7.1.0.rc1 (September 27, 2023) ##
21
+
22
+ * Set `scheduled_at` attribute as a Time object instead of epoch seconds, and serialize and deserialize the value
23
+ when enqueued. Assigning a numeric/epoch value to scheduled_at= is deprecated; use a Time object instead.
24
+
25
+ Deserializes `enqueued_at` as a Time instead of ISO8601 String.
26
+
27
+ *Ben Sheldon*
28
+
29
+ * Clarify the backoff strategy for the recommended `:wait` option when retrying jobs
30
+
31
+ `wait: :exponentially_longer` is waiting polynomially longer, so it is now recommended to use `wait: :polynomially_longer` to keep the same behavior.
32
+
33
+ *Victor Mours*
34
+
35
+
36
+ ## Rails 7.1.0.beta1 (September 13, 2023) ##
2
37
 
3
38
  * Fix Active Job log message to correctly report a job failed to enqueue
4
39
  when the adapter raises an `ActiveJob::EnqueueError`.
5
40
 
6
41
  *Ben Sheldon*
7
42
 
43
+ * Add `after_discard` method.
8
44
 
9
- ## Rails 7.0.7.2 (August 22, 2023) ##
45
+ This method lets job authors define a block which will be run when a job is about to be discarded. For example:
10
46
 
11
- * No changes.
47
+ ```ruby
48
+ class AfterDiscardJob < ActiveJob::Base
49
+ after_discard do |job, exception|
50
+ Rails.logger.info("#{job.class} raised an exception: #{exception}")
51
+ end
12
52
 
53
+ def perform
54
+ raise StandardError
55
+ end
56
+ end
57
+ ```
13
58
 
14
- ## Rails 7.0.7.1 (August 22, 2023) ##
59
+ The above job will run the block passed to `after_discard` after the job is discarded. The exception will
60
+ still be raised after the block has been run.
15
61
 
16
- * No changes.
62
+ *Rob Cardy*
17
63
 
64
+ * Fix deserialization of ActiveSupport::Duration
18
65
 
19
- ## Rails 7.0.7 (August 09, 2023) ##
66
+ Previously, a deserialized Duration would return an array from Duration#parts.
67
+ It will now return a hash just like a regular Duration.
20
68
 
21
- * No changes.
69
+ This also fixes an error when trying to add or subtract from a deserialized Duration
70
+ (eg `duration + 1.year`).
22
71
 
72
+ *Jonathan del Strother*
23
73
 
24
- ## Rails 7.0.6 (June 29, 2023) ##
74
+ * `perform_enqueued_jobs` is now compatible with all Active Job adapters
25
75
 
26
- * Fix error Active Job passed class with `permitted?`.
76
+ This means that methods that depend on it, like Action Mailer's `assert_emails`,
77
+ will work correctly even if the test adapter is not used.
27
78
 
28
- *Alex Baldwin*
79
+ *Alex Ghiculescu*
29
80
 
81
+ * Allow queue adapters to provide a custom name by implementing `queue_adapter_name`
30
82
 
31
- ## Rails 7.0.5.1 (June 26, 2023) ##
83
+ *Sander Verdonschot*
32
84
 
33
- * No changes.
85
+ * Log background job enqueue callers
34
86
 
87
+ Add `verbose_enqueue_logs` configuration option to display the caller
88
+ of background job enqueue in the log to help with debugging.
35
89
 
36
- ## Rails 7.0.5 (May 24, 2023) ##
90
+ Example log line:
37
91
 
38
- * Make delayed job `display_name` failsafe.
92
+ ```
93
+ Enqueued AvatarThumbnailsJob (Job ID: ab528951-41fb-4c48-9129-3171791c27d6) to Sidekiq(default) with arguments: 1092412064
94
+ ↳ app/models/user.rb:421:in `generate_avatar_thumbnails'
95
+ ```
39
96
 
40
- *codez*
97
+ Enabled in development only for new and upgraded applications. Not recommended for use
98
+ in the production environment since it relies on Ruby's `Kernel#caller` which is fairly slow.
41
99
 
42
- * Don't double log the `job` when using `ActiveRecord::QueryLog`
100
+ *fatkodima*
43
101
 
44
- Previously if you set `config.active_record.query_log_tags` to an array that included
45
- `:job`, the job name would get logged twice. This bug has been fixed.
102
+ * Set `provider_job_id` for Backburner jobs
46
103
 
47
- *Alex Ghiculescu*
104
+ *Cameron Matheson*
48
105
 
106
+ * Add `perform_all_later` to enqueue multiple jobs at once
49
107
 
50
- ## Rails 7.0.4.3 (March 13, 2023) ##
108
+ This adds the ability to bulk enqueue jobs, without running callbacks, by
109
+ passing multiple jobs or an array of jobs. For example:
51
110
 
52
- * No changes.
111
+ ```ruby
112
+ ActiveJob.perform_all_later(MyJob.new("hello", 42), MyJob.new("world", 0))
53
113
 
114
+ user_jobs = User.pluck(:id).map { |id| UserJob.new(user_id: id) }
115
+ ActiveJob.perform_all_later(user_jobs)
116
+ ```
54
117
 
55
- ## Rails 7.0.4.2 (January 24, 2023) ##
118
+ This can greatly reduce the number of round-trips to the queue datastore.
119
+ For queue adapters that do not implement the new `enqueue_all` method, we
120
+ fall back to enqueuing jobs individually. The Sidekiq adapter implements
121
+ `enqueue_all` with `push_bulk`.
56
122
 
57
- * No changes.
123
+ This method does not use the existing `enqueue.active_job` event, but adds a
124
+ new event `enqueue_all.active_job`.
58
125
 
126
+ *Sander Verdonschot*
59
127
 
60
- ## Rails 7.0.4.1 (January 17, 2023) ##
128
+ * Don't double log the `job` when using `ActiveRecord::QueryLog`
61
129
 
62
- * No changes.
130
+ Previously if you set `config.active_record.query_log_tags` to an array that included
131
+ `:job`, the job name would get logged twice. This bug has been fixed.
63
132
 
133
+ *Alex Ghiculescu*
64
134
 
65
- ## Rails 7.0.4 (September 09, 2022) ##
135
+ * Add support for Sidekiq's transaction-aware client
66
136
 
67
- * Update `ActiveJob::QueueAdapters::QueAdapter` to remove deprecation warning.
137
+ *Jonathan del Strother*
68
138
 
69
- Remove a deprecation warning introduced in que 1.2 to prepare for changes in
70
- que 2.0 necessary for Ruby 3 compatibility.
139
+ * Remove QueAdapter from Active Job.
71
140
 
72
- *Damir Zekic* and *Adis Hasovic*
141
+ After maintaining Active Job QueAdapter by Rails and Que side
142
+ to support Ruby 3 keyword arguments and options provided as top level keywords,
143
+ it is quite difficult to maintain it this way.
73
144
 
74
- ## Rails 7.0.3.1 (July 12, 2022) ##
145
+ Active Job Que adapter can be included in the future version of que gem itself.
75
146
 
76
- * No changes.
147
+ *Yasuo Honda*
77
148
 
149
+ * Fix BigDecimal (de)serialization for adapters using JSON.
78
150
 
79
- ## Rails 7.0.3 (May 09, 2022) ##
151
+ Previously, BigDecimal was listed as not needing a serializer. However,
152
+ when used with an adapter storing the job arguments as JSON, it would get
153
+ serialized as a simple String, resulting in deserialization also producing
154
+ a String (instead of a BigDecimal).
80
155
 
81
- * Add missing `bigdecimal` require in `ActiveJob::Arguments`
156
+ By using a serializer, we ensure the round trip is safe.
82
157
 
83
- Could cause `uninitialized constant ActiveJob::Arguments::BigDecimal (NameError)`
84
- when loading Active Job in isolation.
158
+ To ensure applications using BigDecimal job arguments are not subject to
159
+ race conditions during deployment (where a replica running a version of
160
+ Rails without BigDecimalSerializer fails to deserialize an argument
161
+ serialized with it), `ActiveJob.use_big_decimal_serializer` is disabled by
162
+ default, and can be set to true in a following deployment..
85
163
 
86
- *Jean Boussier*
164
+ *Sam Bostock*
87
165
 
88
- ## Rails 7.0.2.4 (April 26, 2022) ##
166
+ * Preserve full-precision `enqueued_at` timestamps for serialized jobs,
167
+ allowing more accurate reporting of how long a job spent waiting in the
168
+ queue before it was performed.
89
169
 
90
- * No changes.
170
+ Retains IS08601 format compatibility.
91
171
 
172
+ *Jeremy Daer*
92
173
 
93
- ## Rails 7.0.2.3 (March 08, 2022) ##
174
+ * Add `--parent` option to job generator to specify parent class of job.
94
175
 
95
- * No changes.
176
+ Example:
96
177
 
178
+ `bin/rails g job process_payment --parent=payment_job` generates:
97
179
 
98
- ## Rails 7.0.2.2 (February 11, 2022) ##
180
+ ```ruby
181
+ class ProcessPaymentJob < PaymentJob
182
+ # ...
183
+ end
184
+ ```
99
185
 
100
- * No changes.
186
+ *Gannon McGibbon*
101
187
 
188
+ * Add more detailed description to job generator.
102
189
 
103
- ## Rails 7.0.2.1 (February 11, 2022) ##
190
+ *Gannon McGibbon*
104
191
 
105
- * No changes.
192
+ * `perform.active_job` notification payloads now include `:db_runtime`, which
193
+ is the total time (in ms) taken by database queries while performing a job.
194
+ This value can be used to better understand how a job's time is spent.
106
195
 
196
+ *Jonathan Hefner*
107
197
 
108
- ## Rails 7.0.2 (February 08, 2022) ##
198
+ * Update `ActiveJob::QueueAdapters::QueAdapter` to remove deprecation warning.
109
199
 
110
- * No changes.
200
+ Remove a deprecation warning introduced in que 1.2 to prepare for changes in
201
+ que 2.0 necessary for Ruby 3 compatibility.
202
+
203
+ *Damir Zekic* and *Adis Hasovic*
204
+
205
+ * Add missing `bigdecimal` require in `ActiveJob::Arguments`
111
206
 
207
+ Could cause `uninitialized constant ActiveJob::Arguments::BigDecimal (NameError)`
208
+ when loading Active Job in isolation.
112
209
 
113
- ## Rails 7.0.1 (January 06, 2022) ##
210
+ *Jean Boussier*
114
211
 
115
212
  * Allow testing `discard_on/retry_on ActiveJob::DeserializationError`
116
213
 
@@ -118,7 +215,7 @@
118
215
  was called before calling `perform_now`. When a record no longer exists
119
216
  and is serialized using GlobalID this led to raising
120
217
  an `ActiveJob::DeserializationError` before reaching `perform_now` call.
121
- This behaviour makes difficult testing the job `discard_on/retry_on` logic.
218
+ This behavior makes difficult testing the job `discard_on/retry_on` logic.
122
219
 
123
220
  Now `deserialize_arguments_if_needed` call is postponed to when `perform_now`
124
221
  is called.
@@ -143,104 +240,4 @@
143
240
 
144
241
  *Jacopo Beschi*
145
242
 
146
-
147
- ## Rails 7.0.0 (December 15, 2021) ##
148
-
149
- * No changes.
150
-
151
-
152
- ## Rails 7.0.0.rc3 (December 14, 2021) ##
153
-
154
- * No changes.
155
-
156
-
157
- ## Rails 7.0.0.rc2 (December 14, 2021) ##
158
-
159
- * No changes.
160
-
161
- ## Rails 7.0.0.rc1 (December 06, 2021) ##
162
-
163
- * Remove deprecated `:return_false_on_aborted_enqueue` option.
164
-
165
- *Rafael Mendonça França*
166
-
167
- * Deprecated `Rails.config.active_job.skip_after_callbacks_if_terminated`.
168
-
169
- *Rafael Mendonça França*
170
-
171
- * Removed deprecated behavior that was not halting `after_enqueue`/`after_perform` callbacks when a
172
- previous callback was halted with `throw :abort`.
173
-
174
- *Rafael Mendonça França*
175
-
176
- * Raise an `SerializationError` in `Serializer::ModuleSerializer`
177
- if the module name is not present.
178
-
179
- *Veerpal Brar*
180
-
181
-
182
- ## Rails 7.0.0.alpha2 (September 15, 2021) ##
183
-
184
- * No changes.
185
-
186
-
187
- ## Rails 7.0.0.alpha1 (September 15, 2021) ##
188
-
189
- * Allow a job to retry indefinitely
190
-
191
- The `attempts` parameter of the `retry_on` method now accepts the
192
- symbol reference `:unlimited` in addition to a specific number of retry
193
- attempts to allow a developer to specify that a job should retry
194
- forever until it succeeds.
195
-
196
- class MyJob < ActiveJob::Base
197
- retry_on(AlwaysRetryException, attempts: :unlimited)
198
-
199
- # the actual job code
200
- end
201
-
202
- *Daniel Morton*
203
-
204
- * Added possibility to check on `:priority` in test helper methods
205
- `assert_enqueued_with` and `assert_performed_with`.
206
-
207
- *Wojciech Wnętrzak*
208
-
209
- * OpenSSL constants are now used for Digest computations.
210
-
211
- *Dirkjan Bussink*
212
-
213
- * Add a Serializer for the Range class.
214
-
215
- This should allow things like `MyJob.perform_later(range: 1..100)`.
216
-
217
- * Communicate enqueue failures to callers of `perform_later`.
218
-
219
- `perform_later` can now optionally take a block which will execute after
220
- the adapter attempts to enqueue the job. The block will receive the job
221
- instance as an argument even if the enqueue was not successful.
222
- Additionally, `ActiveJob` adapters now have the ability to raise an
223
- `ActiveJob::EnqueueError` which will be caught and stored in the job
224
- instance so code attempting to enqueue jobs can inspect any raised
225
- `EnqueueError` using the block.
226
-
227
- MyJob.perform_later do |job|
228
- unless job.successfully_enqueued?
229
- if job.enqueue_error&.message == "Redis was unavailable"
230
- # invoke some code that will retry the job after a delay
231
- end
232
- end
233
- end
234
-
235
- *Daniel Morton*
236
-
237
- * Don't log rescuable exceptions defined with `rescue_from`.
238
-
239
- *Hu Hailin*
240
-
241
- * Allow `rescue_from` to rescue all exceptions.
242
-
243
- *Adrianna Chang*, *Étienne Barrié*
244
-
245
-
246
- Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activejob/CHANGELOG.md) for previous changes.
243
+ Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/activejob/CHANGELOG.md) for previous changes.
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014-2022 David Heinemeier Hansson
1
+ Copyright (c) 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
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://edgeguides.rubyonrails.org/active_job_basics.html) guide.
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
 
@@ -47,7 +47,7 @@ module ActiveJob
47
47
 
48
48
  private
49
49
  # :nodoc:
50
- PERMITTED_TYPES = [ NilClass, String, Integer, Float, BigDecimal, TrueClass, FalseClass ]
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
@@ -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:
@@ -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
@@ -14,5 +14,9 @@ module ActiveJob
14
14
  def perform_later(...)
15
15
  @job_class.new(...).enqueue @options
16
16
  end
17
+
18
+ def perform_all_later(multi_args)
19
+ @job_class.perform_all_later(multi_args, options: @options)
20
+ end
17
21
  end
18
22
  end
@@ -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
@@ -10,8 +12,10 @@ module ActiveJob
10
12
  attr_accessor :arguments
11
13
  attr_writer :serialized_arguments
12
14
 
13
- # Timestamp when the job should be performed
14
- attr_accessor :scheduled_at
15
+ # Time when the job should be performed
16
+ attr_reader :scheduled_at
17
+
18
+ attr_reader :_scheduled_at_time # :nodoc:
15
19
 
16
20
  # Job Identifier
17
21
  attr_accessor :job_id
@@ -92,6 +96,8 @@ module ActiveJob
92
96
  @arguments = arguments
93
97
  @job_id = SecureRandom.uuid
94
98
  @queue_name = self.class.queue_name
99
+ @scheduled_at = nil
100
+ @_scheduled_at_time = nil
95
101
  @priority = self.class.priority
96
102
  @executions = 0
97
103
  @exception_executions = {}
@@ -113,7 +119,8 @@ module ActiveJob
113
119
  "exception_executions" => exception_executions,
114
120
  "locale" => I18n.locale.to_s,
115
121
  "timezone" => timezone,
116
- "enqueued_at" => Time.now.utc.iso8601
122
+ "enqueued_at" => Time.now.utc.iso8601(9),
123
+ "scheduled_at" => _scheduled_at_time ? _scheduled_at_time.utc.iso8601(9) : nil,
117
124
  }
118
125
  end
119
126
 
@@ -153,19 +160,32 @@ module ActiveJob
153
160
  self.exception_executions = job_data["exception_executions"]
154
161
  self.locale = job_data["locale"] || I18n.locale.to_s
155
162
  self.timezone = job_data["timezone"] || Time.zone&.name
156
- self.enqueued_at = job_data["enqueued_at"]
163
+ self.enqueued_at = Time.iso8601(job_data["enqueued_at"]) if job_data["enqueued_at"]
164
+ self.scheduled_at = Time.iso8601(job_data["scheduled_at"]) if job_data["scheduled_at"]
157
165
  end
158
166
 
159
167
  # Configures the job with the given options.
160
168
  def set(options = {}) # :nodoc:
161
- self.scheduled_at = options[:wait].seconds.from_now.to_f if options[:wait]
162
- self.scheduled_at = options[:wait_until].to_f if options[:wait_until]
169
+ self.scheduled_at = options[:wait].seconds.from_now if options[:wait]
170
+ self.scheduled_at = options[:wait_until] if options[:wait_until]
163
171
  self.queue_name = self.class.queue_name_from_part(options[:queue]) if options[:queue]
164
172
  self.priority = options[:priority].to_i if options[:priority]
165
173
 
166
174
  self
167
175
  end
168
176
 
177
+ def scheduled_at=(value)
178
+ @_scheduled_at_time = if value&.is_a?(Numeric)
179
+ ActiveJob.deprecator.warn(<<~MSG.squish)
180
+ Assigning a numeric/epoch value to scheduled_at is deprecated. Use a Time object instead.
181
+ MSG
182
+ Time.at(value)
183
+ else
184
+ value
185
+ end
186
+ @scheduled_at = value
187
+ end
188
+
169
189
  private
170
190
  def serialize_arguments_if_needed(arguments)
171
191
  if arguments_serialized?
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveJob
4
+ def self.deprecator # :nodoc:
5
+ @deprecator ||= ActiveSupport::Deprecation.new
6
+ end
7
+ end
@@ -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_time.to_f)
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
 
@@ -62,7 +92,7 @@ module ActiveJob
62
92
 
63
93
  run_callbacks :enqueue do
64
94
  if scheduled_at
65
- queue_adapter.enqueue_at self, scheduled_at
95
+ queue_adapter.enqueue_at self, _scheduled_at_time.to_f
66
96
  else
67
97
  queue_adapter.enqueue self
68
98
  end