Skip to content

Commit 7a5d43e

Browse files
committed
Raise ActiveJob::EnqueueError on ActiveRecordError on enqueuing
1 parent 664931d commit 7a5d43e

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

app/models/solid_queue/job.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ def enqueue(active_job, scheduled_at: Time.current)
3737

3838
def create_from_active_job(active_job)
3939
create!(**attributes_from_active_job(active_job))
40+
rescue ActiveRecord::ActiveRecordError => e
41+
enqueue_error = ActiveJob::EnqueueError.new("#{e.class.name}: #{e.message}").tap do |error|
42+
error.set_backtrace e.backtrace
43+
end
44+
raise enqueue_error
4045
end
4146

4247
def create_all_from_active_jobs(active_jobs)

test/models/solid_queue/job_test.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,22 @@ class NonOverlappingGroupedJob2 < NonOverlappingJob
241241
end
242242
end
243243

244+
test "raise ActiveJob::EnqueueError when there's an ActiveRecordError" do
245+
SolidQueue::Job.stubs(:create!).raises(ActiveRecord::Deadlocked)
246+
247+
active_job = AddToBufferJob.new(1).set(priority: 8, queue: "test")
248+
assert_raises ActiveJob::EnqueueError do
249+
SolidQueue::Job.enqueue(active_job)
250+
end
251+
252+
enqueue_result = AddToBufferJob.perform_later(1) do |job|
253+
assert job.enqueue_error.is_a? ActiveJob::EnqueueError
254+
assert_not job.successfully_enqueued?
255+
end
256+
257+
assert_not enqueue_result
258+
end
259+
244260
if ENV["SEPARATE_CONNECTION"] && ENV["TARGET_DB"] != "sqlite"
245261
test "uses a different connection and transaction than the one in use when connects_to is specified" do
246262
assert_difference -> { SolidQueue::Job.count } do

0 commit comments

Comments
 (0)