Skip to content

Commit 423dcce

Browse files
committed
Defer ActiveJob enqueue callbacks until after commit when enqueue_after_transaction_commit enabled
1 parent c593a74 commit 423dcce

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

activejob/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
* Defer invocation of ActiveJob enqueue callbacks until after commit when
2+
`enqueue_after_transaction_commit` is enabled.
3+
4+
*Will Roever*
5+
16
* Add `report:` option to `ActiveJob::Base#retry_on` and `#discard_on`
27

38
When the `report:` option is passed, errors will be reported to the error reporter

activejob/lib/active_job/enqueuing.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,7 @@ def enqueue(options = {})
113113
set(options)
114114
self.successfully_enqueued = false
115115

116-
run_callbacks :enqueue do
117-
raw_enqueue
118-
end
116+
raw_enqueue
119117

120118
if successfully_enqueued?
121119
self
@@ -126,6 +124,12 @@ def enqueue(options = {})
126124

127125
private
128126
def raw_enqueue
127+
run_callbacks :enqueue do
128+
_raw_enqueue
129+
end
130+
end
131+
132+
def _raw_enqueue
129133
if scheduled_at
130134
queue_adapter.enqueue_at self, scheduled_at.to_f
131135
else

activejob/test/cases/enqueue_after_transaction_commit_test.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,21 @@ def perform
5555
end
5656
end
5757

58+
class EnqueueAfterCommitCallbackJob < ActiveJob::Base
59+
self.enqueue_after_transaction_commit = true
60+
61+
attr_reader :around_enqueue_called
62+
63+
around_enqueue do |job, block|
64+
job.instance_variable_set(:@around_enqueue_called, true)
65+
block.call
66+
end
67+
68+
def perform
69+
# noop
70+
end
71+
end
72+
5873
test "#perform_later wait for transactions to complete before enqueuing the job" do
5974
fake_active_record = FakeActiveRecord.new
6075
stub_const(Object, :ActiveRecord, fake_active_record, exists: false) do
@@ -98,4 +113,14 @@ def perform
98113
assert_not_predicate job, :successfully_enqueued?
99114
end
100115
end
116+
117+
test "#perform_later defers enqueue callbacks until after commit" do
118+
fake_active_record = FakeActiveRecord.new(false)
119+
stub_const(Object, :ActiveRecord, fake_active_record, exists: false) do
120+
job = EnqueueAfterCommitCallbackJob.perform_later
121+
assert_not_predicate job, :around_enqueue_called
122+
fake_active_record.run_after_commit_callbacks
123+
assert_predicate job, :around_enqueue_called
124+
end
125+
end
101126
end

0 commit comments

Comments
 (0)