From d7a9e6796e8dca25fc43af82c73a64adc4119ac6 Mon Sep 17 00:00:00 2001 From: Jonathan Prass Martins Date: Thu, 16 Mar 2023 18:14:36 -0300 Subject: [PATCH] Possibility to change the default configurations for the queue jobs. (#13) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add $queue attribute This code enables me to change the queue name that the JobPipeline will be pushed to. Now I can do something like this: ```php JobPipeline::make([ Jobs\CreateDatabase::class, Jobs\MigrateDatabase::class, // Jobs\SeedDatabase::class, // Your own jobs to prepare the tenant. // Provision API keys, create S3 buckets, anything you want! ])->send(function (Events\TenantCreated $event) { return $event->tenant; })->onQueue('another-queue') ->shouldBeQueued() ``` * Add .idea directory to gitignore * The following methods where added: onConnection, onQueue, delay, tries, shouldBeQueuedOn. The signature of shouldBeQueued was changed too. * reuse shouldBeQueuedOn * updating docs * added timeout * docs updated * .phpunit.cache/ added to gitignore * tests for shouldQueueOn method * leave only shouldBeQueued method * update README * remove unnecessary property declarations * Delete jobpipelinetest.json * add jobpipelinetest.json as a empty file * update readme * simplify tests * improve code * improve readme --------- Co-authored-by: Samuel Ć tancl --- .gitignore | 2 ++ README.md | 20 ++++++++++++++++++++ src/JobPipeline.php | 11 +++++++++-- tests/JobPipelineTest.php | 28 +++++++++++++++++++++++++++- 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 7b37592..27f6517 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ composer.lock .phpunit.result.cache .php-cs-fixer.cache +.idea/ +.phpunit.cache/ diff --git a/README.md b/README.md index f40284c..c3dfc17 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,26 @@ JobPipeline::make([ })->shouldBeQueued(true) ``` +If you wish to push the job to a different queue, you can pass a string as the second parameter: + +```php +send(function (TenantCreated $event) { + return $event->tenant; +})->shouldBeQueued(true, 'another-queue'); +``` + +This can be simplified by calling `shouldBeQueued(queue: 'another-queue')` since the first parameter defaults to `true`. + Finally, convert the pipeline to a listener and bind it to an event: ```php diff --git a/src/JobPipeline.php b/src/JobPipeline.php index a3f7bc3..de597ea 100644 --- a/src/JobPipeline.php +++ b/src/JobPipeline.php @@ -25,7 +25,10 @@ class JobPipeline implements ShouldQueue public $passable; /** @var bool */ - public $shouldBeQueued; + public bool $shouldBeQueued; + + /** @var string */ + public string $queue; public function __construct($jobs, callable $send = null, bool $shouldBeQueued = null) { @@ -50,10 +53,14 @@ class JobPipeline implements ShouldQueue return $this; } - public function shouldBeQueued(bool $shouldBeQueued = true) + public function shouldBeQueued(bool $shouldBeQueued = true, string $queue = null) { $this->shouldBeQueued = $shouldBeQueued; + if ($queue) { + $this->queue = $queue; + } + return $this; } diff --git a/tests/JobPipelineTest.php b/tests/JobPipelineTest.php index 6331770..bf8d1a5 100644 --- a/tests/JobPipelineTest.php +++ b/tests/JobPipelineTest.php @@ -80,6 +80,32 @@ class JobPipelineTest extends TestCase $this->assertSame('bar', $this->valuestore->get('foo')); } + /** @test */ + public function job_pipelines_can_use_a_specific_queue() + { + Event::listen(TestEvent::class, JobPipeline::make([ + FooJob::class, + ])->send(function () { + return $this->valuestore; + })->shouldBeQueued(queue: 'another')->toListener()); + + $this->assertFalse($this->valuestore->has('foo')); + event(new TestEvent(new TestModel())); + + $this->artisan('queue:work --once --queue=default'); + + sleep(1); + + // Job hasn't run since it was pushed to the 'another' queue + $this->assertNull($this->valuestore->get('foo')); + + $this->artisan('queue:work --once --queue=another'); + + sleep(1); + + $this->assertSame('bar', $this->valuestore->get('foo')); + } + /** @test */ public function job_pipeline_executes_jobs_and_passes_the_object_sequentially() { @@ -133,7 +159,7 @@ class JobPipelineTest extends TestCase // Foo job is not excuted $this->assertFalse($this->valuestore->has('foo')); } - + /** @test */ public function the_pipeline_can_execute_failed_method_on_job() {