Skip to content

Commit 5d7c949

Browse files
committed
Fix enqueuing recurring task with job outside Solid Queue
Calling `set` on the job class returns a `ConfiguredJob`, and calling `perform_later` on a `ConfiguredJob` doesn't yield the job to a block passed as parameter, so we can't check if the enqueuing was successful or not. To work around this, the only way is to instantiate the job ourselves with the arguments, then call `enqueue` on that, and rely on the result, which would be what `job_class.perform_later` would yield to the block.
1 parent a4467db commit 5d7c949

File tree

2 files changed

+18
-15
lines changed

2 files changed

+18
-15
lines changed

app/models/solid_queue/recurring_task.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def enqueue(at:)
5555
else
5656
payload[:other_adapter] = true
5757

58-
perform_later do |job|
58+
perform_later.tap do |job|
5959
unless job.successfully_enqueued?
6060
payload[:enqueue_error] = job.enqueue_error&.message
6161
end
@@ -106,8 +106,10 @@ def enqueue_and_record(run_at:)
106106
end
107107
end
108108

109-
def perform_later(&block)
110-
job_class.set(enqueue_options).perform_later(*arguments_with_kwargs, &block)
109+
def perform_later
110+
job_class.new(*arguments_with_kwargs).tap do |active_job|
111+
active_job.enqueue(enqueue_options)
112+
end
111113
end
112114

113115
def arguments_with_kwargs

test/integration/instrumentation_test.rb

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -305,12 +305,12 @@ class InstrumentationTest < ActiveSupport::TestCase
305305

306306
test "enqueuing recurring task emits enqueue_recurring_task event" do
307307
recurring_task = { example_task: { class: "AddToBufferJob", schedule: "every second", args: 42 } }
308-
dispatcher = SolidQueue::Dispatcher.new(concurrency_maintenance: false, recurring_tasks: recurring_task)
308+
scheduler = SolidQueue::Scheduler.new(recurring_tasks: recurring_task)
309309

310310
events = subscribed("enqueue_recurring_task.solid_queue") do
311-
dispatcher.start
311+
scheduler.start
312312
sleep 1.01
313-
dispatcher.stop
313+
scheduler.stop
314314
end
315315

316316
assert events.size >= 1
@@ -323,12 +323,12 @@ class InstrumentationTest < ActiveSupport::TestCase
323323

324324
test "skipping a recurring task is reflected in the enqueue_recurring_task event" do
325325
recurring_task = { example_task: { class: "AddToBufferJob", schedule: "every second", args: 42 } }
326-
dispatchers = 2.times.collect { SolidQueue::Dispatcher.new(concurrency_maintenance: false, recurring_tasks: recurring_task) }
326+
schedulers = 2.times.collect { SolidQueue::Scheduler.new(recurring_tasks: recurring_task) }
327327

328328
events = subscribed("enqueue_recurring_task.solid_queue") do
329-
dispatchers.each(&:start)
329+
schedulers.each(&:start)
330330
sleep 1.01
331-
dispatchers.each(&:stop)
331+
schedulers.each(&:stop)
332332
end
333333

334334
assert events.size >= 2
@@ -349,12 +349,12 @@ class InstrumentationTest < ActiveSupport::TestCase
349349
recurring_task = { example_task: { class: "AddToBufferJob", schedule: "every second", args: 42 } }
350350
SolidQueue::Job.stubs(:create!).raises(ActiveRecord::Deadlocked)
351351

352-
dispatcher = SolidQueue::Dispatcher.new(concurrency_maintenance: false, recurring_tasks: recurring_task)
352+
scheduler = SolidQueue::Scheduler.new(recurring_tasks: recurring_task)
353353

354354
events = subscribed("enqueue_recurring_task.solid_queue") do
355-
dispatcher.start
355+
scheduler.start
356356
sleep(1.01)
357-
dispatcher.stop
357+
scheduler.stop
358358
end
359359

360360
assert events.size >= 1
@@ -368,14 +368,15 @@ class InstrumentationTest < ActiveSupport::TestCase
368368
test "an error enqueuing a recurring task with another adapter is reflected in the enqueue_recurring_task event" do
369369
AddToBufferJob.queue_adapter = :async
370370
ActiveJob::QueueAdapters::AsyncAdapter.any_instance.stubs(:enqueue).raises(ActiveJob::EnqueueError.new("All is broken"))
371+
371372
recurring_task = { example_task: { class: "AddToBufferJob", schedule: "every second", args: 42 } }
372373

373-
dispatcher = SolidQueue::Dispatcher.new(concurrency_maintenance: false, recurring_tasks: recurring_task)
374+
scheduler = SolidQueue::Scheduler.new(recurring_tasks: recurring_task)
374375

375376
events = subscribed("enqueue_recurring_task.solid_queue") do
376-
dispatcher.start
377+
scheduler.start
377378
sleep(1.01)
378-
dispatcher.stop
379+
scheduler.stop
379380
end
380381

381382
assert events.size >= 1

0 commit comments

Comments
 (0)