From 792d3ac7544d7b950a40e477eb6f9dafe9c2c25b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateus=20Guimar=C3=A3es?= Date: Sat, 28 Oct 2023 21:15:47 -0300 Subject: [PATCH 1/4] Fix after commit jobs using the sync queue --- src/Illuminate/Queue/SyncQueue.php | 22 ++++++++++++++++++++++ tests/Queue/QueueSyncQueueTest.php | 26 ++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/Illuminate/Queue/SyncQueue.php b/src/Illuminate/Queue/SyncQueue.php index f416b0232fd3..ef473e758b0e 100755 --- a/src/Illuminate/Queue/SyncQueue.php +++ b/src/Illuminate/Queue/SyncQueue.php @@ -34,6 +34,28 @@ public function size($queue = null) * @throws \Throwable */ public function push($job, $data = '', $queue = null) + { + if ($this->shouldDispatchAfterCommit($job) && + $this->container->bound('db.transactions')) { + return $this->container->make('db.transactions')->addCallback( + fn () => $this->executeJob($job, $data, $queue) + ); + } + + return $this->executeJob($job, $data, $queue); + } + + /** + * Execute a given job synchronously. + * + * @param string $job + * @param mixed $data + * @param string|null $queue + * @return int + * + * @throws \Throwable + */ + public function executeJob($job, $data = '', $queue = null) { $queueJob = $this->resolveJob($this->createPayload($job, $queue, $data), $queue); diff --git a/tests/Queue/QueueSyncQueueTest.php b/tests/Queue/QueueSyncQueueTest.php index c833b87a30ca..24ea82c43344 100755 --- a/tests/Queue/QueueSyncQueueTest.php +++ b/tests/Queue/QueueSyncQueueTest.php @@ -7,6 +7,7 @@ use Illuminate\Contracts\Events\Dispatcher; use Illuminate\Contracts\Queue\QueueableEntity; use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Database\DatabaseTransactionsManager; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\Jobs\SyncJob; use Illuminate\Queue\SyncQueue; @@ -77,6 +78,19 @@ public function testCreatesPayloadObject() $this->assertSame('extraValue', $e->getMessage()); } } + + public function testItAddsATransactionCallbackForAfterCommitJobs() + { + $sync = new SyncQueue; + $container = new Container; + $container->bind(\Illuminate\Contracts\Container\Container::class, \Illuminate\Container\Container::class); + $transactionManager = m::mock(DatabaseTransactionsManager::class); + $transactionManager->shouldReceive('addCallback')->once()->andReturn(null); + $container->instance('db.transactions', $transactionManager); + + $sync->setContainer($container); + $sync->push(new SyncQueueAfterCommitJob()); + } } class SyncQueueTestEntity implements QueueableEntity @@ -134,3 +148,15 @@ public function getValueFromJob($key) return $payload['data'][$key] ?? null; } } + +class SyncQueueAfterCommitJob +{ + use InteractsWithQueue; + + public $afterCommit = true; + + public function handle() + { + + } +} From 3deafb841f8ca4c2d7e1bab8b6e8a757121947ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateus=20Guimar=C3=A3es?= Date: Mon, 30 Oct 2023 12:32:52 -0300 Subject: [PATCH 2/4] Additional test --- tests/Queue/QueueSyncQueueTest.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/Queue/QueueSyncQueueTest.php b/tests/Queue/QueueSyncQueueTest.php index 24ea82c43344..a361bf5e773b 100755 --- a/tests/Queue/QueueSyncQueueTest.php +++ b/tests/Queue/QueueSyncQueueTest.php @@ -7,6 +7,7 @@ use Illuminate\Contracts\Events\Dispatcher; use Illuminate\Contracts\Queue\QueueableEntity; use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Contracts\Queue\ShouldQueueAfterCommit; use Illuminate\Database\DatabaseTransactionsManager; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\Jobs\SyncJob; @@ -91,6 +92,19 @@ public function testItAddsATransactionCallbackForAfterCommitJobs() $sync->setContainer($container); $sync->push(new SyncQueueAfterCommitJob()); } + + public function testItAddsATransactionCallbackForInterfaceBasedAfterCommitJobs() + { + $sync = new SyncQueue; + $container = new Container; + $container->bind(\Illuminate\Contracts\Container\Container::class, \Illuminate\Container\Container::class); + $transactionManager = m::mock(DatabaseTransactionsManager::class); + $transactionManager->shouldReceive('addCallback')->once()->andReturn(null); + $container->instance('db.transactions', $transactionManager); + + $sync->setContainer($container); + $sync->push(new SyncQueueAfterCommitInterfaceJob()); + } } class SyncQueueTestEntity implements QueueableEntity @@ -157,6 +171,14 @@ class SyncQueueAfterCommitJob public function handle() { + } +} +class SyncQueueAfterCommitInterfaceJob implements ShouldQueueAfterCommit +{ + use InteractsWithQueue; + + public function handle() + { } } From 69b661b245f06a831d80cd6a590c633ab27bedac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateus=20Guimar=C3=A3es?= Date: Mon, 30 Oct 2023 12:33:10 -0300 Subject: [PATCH 3/4] Remove unnecessary check --- src/Illuminate/Queue/Queue.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Queue/Queue.php b/src/Illuminate/Queue/Queue.php index 0ce7ad1ac1ce..69fe00c4ddd1 100755 --- a/src/Illuminate/Queue/Queue.php +++ b/src/Illuminate/Queue/Queue.php @@ -326,7 +326,7 @@ function () use ($payload, $queue, $delay, $callback, $job) { */ protected function shouldDispatchAfterCommit($job) { - if (is_object($job) && $job instanceof ShouldQueueAfterCommit) { + if ($job instanceof ShouldQueueAfterCommit) { return true; } From 75d5831e77891262e091d66289777f10038a7f46 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Wed, 1 Nov 2023 14:30:27 -0500 Subject: [PATCH 4/4] formatting --- src/Illuminate/Queue/SyncQueue.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Queue/SyncQueue.php b/src/Illuminate/Queue/SyncQueue.php index ef473e758b0e..c687635ee3ea 100755 --- a/src/Illuminate/Queue/SyncQueue.php +++ b/src/Illuminate/Queue/SyncQueue.php @@ -55,7 +55,7 @@ public function push($job, $data = '', $queue = null) * * @throws \Throwable */ - public function executeJob($job, $data = '', $queue = null) + protected function executeJob($job, $data = '', $queue = null) { $queueJob = $this->resolveJob($this->createPayload($job, $queue, $data), $queue);