diff --git a/src/ActionJob.php b/src/ActionJob.php index 057d450..f1e98dd 100644 --- a/src/ActionJob.php +++ b/src/ActionJob.php @@ -9,6 +9,7 @@ use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Throwable; +use DateTime; class ActionJob implements ShouldQueue { @@ -33,6 +34,9 @@ class ActionJob implements ShouldQueue protected $backoff; + /** @var DateTime|null */ + protected $retryUntil; + public function __construct($action, array $parameters = []) { $this->actionClass = is_string($action) ? $action : get_class($action); @@ -46,6 +50,10 @@ public function __construct($action, array $parameters = []) $this->backoff = $action->backoff(); } + if (method_exists($action, 'retryUntil')) { + $this->retryUntil = $action->retryUntil(); + } + if (method_exists($action, 'failed')) { $this->onFailCallback = [$action, 'failed']; } @@ -79,6 +87,11 @@ public function backoff() return $this->backoff; } + public function retryUntil() + { + return $this->retryUntil; + } + public function failed(Throwable $exception) { if ($this->onFailCallback) { diff --git a/tests/QueueableActionTest.php b/tests/QueueableActionTest.php index fe288ad..69d7a26 100644 --- a/tests/QueueableActionTest.php +++ b/tests/QueueableActionTest.php @@ -2,6 +2,7 @@ namespace Spatie\QueueableAction\Tests; +use DateTime; use Exception; use Illuminate\Bus\PendingBatch; use Illuminate\Database\Schema\Blueprint; @@ -24,6 +25,7 @@ use Spatie\QueueableAction\Tests\TestClasses\InvokeableAction; use Spatie\QueueableAction\Tests\TestClasses\MiddlewareAction; use Spatie\QueueableAction\Tests\TestClasses\ModelSerializationUser; +use Spatie\QueueableAction\Tests\TestClasses\RetryUntilAction; use Spatie\QueueableAction\Tests\TestClasses\SimpleAction; use Spatie\QueueableAction\Tests\TestClasses\TaggedAction; use stdClass; @@ -281,6 +283,18 @@ public function middleware(): array }); }); +test('an action can have a retryUntil function', function () { + Queue::fake(); + $until = DateTime::createFromFormat("Y-m-d H:m:s", "2000-01-01 00:00:00"); + $action = new RetryUntilAction(); + + $action->onQueue()->execute(); + + Queue::assertPushed(ActionJob::class, function ($action) use ($until) { + return $action->retryUntil()->getTimestamp() === $until->getTimestamp(); + }); +}); + test('an action can be batched', function () { Bus::fake(); diff --git a/tests/TestClasses/RetryUntilAction.php b/tests/TestClasses/RetryUntilAction.php new file mode 100644 index 0000000..72bf346 --- /dev/null +++ b/tests/TestClasses/RetryUntilAction.php @@ -0,0 +1,21 @@ +