@@ -29,21 +29,18 @@ class Job
29
29
30
30
SQL [ :bulk_insert_jobs ] =
31
31
%{
32
- WITH args_and_kwargs as (
33
- SELECT * from json_to_recordset(coalesce($5, '[{args:{},kwargs:{}}]')::json) as x(args jsonb, kwargs jsonb)
34
- )
35
32
INSERT INTO public.que_jobs
36
33
(queue, priority, run_at, job_class, args, kwargs, data, job_schema_version)
37
34
SELECT
38
- coalesce($1 , 'default')::text,
39
- coalesce($2 , 100)::smallint,
40
- coalesce($3 , now())::timestamptz,
41
- $4::text ,
42
- args_and_kwargs. args,
43
- args_and_kwargs. kwargs,
44
- coalesce($6 , '{}')::jsonb,
35
+ coalesce(queue , 'default')::text,
36
+ coalesce(priority , 100)::smallint,
37
+ coalesce(run_at , now())::timestamptz,
38
+ job_class ,
39
+ coalesce( args, '[]')::jsonb ,
40
+ coalesce( kwargs, '{}')::jsonb ,
41
+ coalesce(data , '{}')::jsonb,
45
42
#{ Que . job_schema_version }
46
- FROM args_and_kwargs
43
+ FROM json_populate_recordset(null::que_jobs, $1)
47
44
RETURNING *
48
45
}
49
46
@@ -82,6 +79,9 @@ def enqueue(*args)
82
79
83
80
job_options = kwargs . delete ( :job_options ) || { }
84
81
82
+ job_class = job_options [ :job_class ] || name ||
83
+ raise ( Error , "Can't enqueue an anonymous subclass of Que::Job" )
84
+
85
85
if job_options [ :tags ]
86
86
if job_options [ :tags ] . length > MAXIMUM_TAGS_COUNT
87
87
raise Que ::Error , "Can't enqueue a job with more than #{ MAXIMUM_TAGS_COUNT } tags! (passed #{ job_options [ :tags ] . length } )"
@@ -94,28 +94,40 @@ def enqueue(*args)
94
94
end
95
95
end
96
96
97
- attrs = {
98
- queue : job_options [ :queue ] || resolve_que_setting ( :queue ) || Que . default_queue ,
99
- priority : job_options [ :priority ] || resolve_que_setting ( :priority ) ,
100
- run_at : job_options [ :run_at ] || resolve_que_setting ( :run_at ) ,
101
- args : args ,
102
- kwargs : kwargs ,
103
- data : job_options [ :tags ] ? { tags : job_options [ :tags ] } : { } ,
104
- job_class : \
105
- job_options [ :job_class ] || name ||
106
- raise ( Error , "Can't enqueue an anonymous subclass of Que::Job" ) ,
107
- }
108
-
109
97
if Thread . current [ :que_jobs_to_bulk_insert ]
98
+ # Don't resolve class settings during `.enqueue`, only resolve them
99
+ # during `._bulk_enqueue_insert` so they can be overwritten by specifying
100
+ # them in `.bulk_enqueue`.
101
+ attrs = {
102
+ queue : job_options [ :queue ] ,
103
+ priority : job_options [ :priority ] ,
104
+ run_at : job_options [ :run_at ] ,
105
+ job_class : job_class == 'Que::Job' ? nil : job_class ,
106
+ args : args ,
107
+ kwargs : kwargs ,
108
+ data : job_options [ :tags ] && { tags : job_options [ :tags ] } ,
109
+ klass : self ,
110
+ }
111
+
110
112
if self . name == 'ActiveJob::QueueAdapters::QueAdapter::JobWrapper'
111
113
raise Que ::Error , "Que.bulk_enqueue does not support ActiveJob."
112
114
end
113
115
114
- raise Que ::Error , "When using .bulk_enqueue, job_options must be passed to that method rather than .enqueue" unless job_options == { }
115
-
116
116
Thread . current [ :que_jobs_to_bulk_insert ] [ :jobs_attrs ] << attrs
117
- new ( { } )
118
- elsif attrs [ :run_at ] . nil? && resolve_que_setting ( :run_synchronously )
117
+ return new ( { } )
118
+ end
119
+
120
+ attrs = {
121
+ queue : job_options [ :queue ] || resolve_que_setting ( :queue ) || Que . default_queue ,
122
+ priority : job_options [ :priority ] || resolve_que_setting ( :priority ) ,
123
+ run_at : job_options [ :run_at ] || resolve_que_setting ( :run_at ) ,
124
+ job_class : job_class ,
125
+ args : args ,
126
+ kwargs : kwargs ,
127
+ data : job_options [ :tags ] ? { tags : job_options [ :tags ] } : { } ,
128
+ }
129
+
130
+ if attrs [ :run_at ] . nil? && resolve_que_setting ( :run_synchronously )
119
131
attrs . merge! (
120
132
args : Que . deserialize_json ( Que . serialize_json ( attrs [ :args ] ) ) ,
121
133
kwargs : Que . deserialize_json ( Que . serialize_json ( attrs [ :kwargs ] ) ) ,
@@ -144,16 +156,13 @@ def bulk_enqueue(job_options: {}, notify: false)
144
156
jobs_attrs = Thread . current [ :que_jobs_to_bulk_insert ] [ :jobs_attrs ]
145
157
job_options = Thread . current [ :que_jobs_to_bulk_insert ] [ :job_options ]
146
158
return [ ] if jobs_attrs . empty?
147
- raise Que ::Error , "When using .bulk_enqueue, all jobs enqueued must be of the same job class" unless jobs_attrs . map { |attrs | attrs [ :job_class ] } . uniq . one?
148
- args_and_kwargs_array = jobs_attrs . map { |attrs | attrs . slice ( :args , :kwargs ) }
149
- klass = job_options [ :job_class ] ? Que ::Job : Que . constantize ( jobs_attrs . first [ :job_class ] )
150
- klass . _bulk_enqueue_insert ( args_and_kwargs_array , job_options : job_options , notify : notify )
159
+ _bulk_enqueue_insert ( jobs_attrs , job_options : job_options , notify : notify )
151
160
ensure
152
161
Thread . current [ :que_jobs_to_bulk_insert ] = nil
153
162
end
154
163
155
- def _bulk_enqueue_insert ( args_and_kwargs_array , job_options : { } , notify :)
156
- raise 'Unexpected bulk args format' if !args_and_kwargs_array . is_a? ( Array ) || !args_and_kwargs_array . all? { |a | a . is_a? ( Hash ) }
164
+ def _bulk_enqueue_insert ( jobs_attrs , job_options : { } , notify : false )
165
+ raise 'Unexpected bulk args format' if !jobs_attrs . is_a? ( Array ) || !jobs_attrs . all? { |a | a . is_a? ( Hash ) }
157
166
158
167
if job_options [ :tags ]
159
168
if job_options [ :tags ] . length > MAXIMUM_TAGS_COUNT
@@ -167,49 +176,43 @@ def _bulk_enqueue_insert(args_and_kwargs_array, job_options: {}, notify:)
167
176
end
168
177
end
169
178
170
- args_and_kwargs_array = args_and_kwargs_array . map do |args_and_kwargs |
171
- args_and_kwargs . merge (
172
- args : args_and_kwargs . fetch ( :args , [ ] ) ,
173
- kwargs : args_and_kwargs . fetch ( :kwargs , { } ) ,
174
- )
175
- end
176
-
177
- attrs = {
178
- queue : job_options [ :queue ] || resolve_que_setting ( :queue ) || Que . default_queue ,
179
- priority : job_options [ :priority ] || resolve_que_setting ( :priority ) ,
180
- run_at : job_options [ :run_at ] || resolve_que_setting ( :run_at ) ,
181
- args_and_kwargs_array : args_and_kwargs_array ,
182
- data : job_options [ :tags ] ? { tags : job_options [ :tags ] } : { } ,
183
- job_class : \
184
- job_options [ :job_class ] || name ||
185
- raise ( Error , "Can't enqueue an anonymous subclass of Que::Job" ) ,
186
- }
187
-
188
- if attrs [ :run_at ] . nil? && resolve_que_setting ( :run_synchronously )
189
- args_and_kwargs_array = Que . deserialize_json ( Que . serialize_json ( attrs . delete ( :args_and_kwargs_array ) ) )
190
- args_and_kwargs_array . map do |args_and_kwargs |
191
- _run_attrs (
192
- attrs . merge (
193
- args : args_and_kwargs . fetch ( :args ) ,
194
- kwargs : args_and_kwargs . fetch ( :kwargs ) ,
195
- ) ,
179
+ jobs_attrs = jobs_attrs . map do |attrs |
180
+ klass = attrs [ :klass ] || self
181
+
182
+ attrs = {
183
+ queue : attrs [ :queue ] || job_options [ :queue ] || klass . resolve_que_setting ( :queue ) || Que . default_queue ,
184
+ priority : attrs [ :priority ] || job_options [ :priority ] || klass . resolve_que_setting ( :priority ) ,
185
+ run_at : attrs [ :run_at ] || job_options [ :run_at ] || klass . resolve_que_setting ( :run_at ) ,
186
+ job_class : attrs [ :job_class ] || job_options [ :job_class ] || klass . name ,
187
+ args : attrs [ :args ] || [ ] ,
188
+ kwargs : attrs [ :kwargs ] || { } ,
189
+ data : attrs [ :data ] || ( job_options [ :tags ] ? { tags : job_options [ :tags ] } : { } ) ,
190
+ klass : klass
191
+ }
192
+
193
+ if attrs [ :run_at ] . nil? && klass . resolve_que_setting ( :run_synchronously )
194
+ klass . _run_attrs (
195
+ attrs . except ( :klass ) . merge (
196
+ args : Que . deserialize_json ( Que . serialize_json ( attrs [ :args ] ) ) ,
197
+ kwargs : Que . deserialize_json ( Que . serialize_json ( attrs [ :kwargs ] ) ) ,
198
+ data : Que . deserialize_json ( Que . serialize_json ( attrs [ :data ] ) ) ,
199
+ )
196
200
)
201
+ nil
202
+ else
203
+ attrs
197
204
end
198
- else
199
- attrs . merge! (
200
- args_and_kwargs_array : Que . serialize_json ( attrs [ :args_and_kwargs_array ] ) ,
201
- data : Que . serialize_json ( attrs [ :data ] ) ,
202
- )
203
- values_array =
204
- Que . transaction do
205
- Que . execute ( 'SET LOCAL que.skip_notify TO true' ) unless notify
206
- Que . execute (
207
- :bulk_insert_jobs ,
208
- attrs . values_at ( :queue , :priority , :run_at , :job_class , :args_and_kwargs_array , :data ) ,
209
- )
210
- end
211
- values_array . map ( &method ( :new ) )
212
- end
205
+ end . compact
206
+
207
+ values_array =
208
+ Que . transaction do
209
+ Que . execute ( 'SET LOCAL que.skip_notify TO true' ) unless notify
210
+ Que . execute (
211
+ :bulk_insert_jobs ,
212
+ [ Que . serialize_json ( jobs_attrs . map { |attrs | attrs . except ( :klass ) } ) ]
213
+ )
214
+ end
215
+ values_array . zip ( jobs_attrs ) . map { |values , attrs | attrs . fetch ( :klass ) . new ( values ) }
213
216
end
214
217
215
218
def run ( *args )
@@ -237,7 +240,7 @@ def resolve_que_setting(setting, *args)
237
240
end
238
241
end
239
242
240
- private
243
+ protected
241
244
242
245
def _run_attrs ( attrs )
243
246
attrs [ :error_count ] = 0
0 commit comments