Skip to content

Commit a4beab3

Browse files
committed
Recreate task ulid when redispatching
1 parent 231622b commit a4beab3

7 files changed

Lines changed: 74 additions & 28 deletions

File tree

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
3.2.0
2+
=====
3+
4+
* (feature) Add `TaskScheduler`.
5+
* (improvement) Update task ULID when redispatching in the scheduler.
6+
* (improvement) Require PHP 8.5+
7+
8+
19
3.1.1
210
=====
311

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
],
1212
"homepage": "https://github.com/21TORR/TaskManagerBundle",
1313
"require": {
14-
"php": ">= 8.4",
14+
"php": ">= 8.5",
1515
"21torr/bundle-helpers": "^2.3.1",
1616
"21torr/cli": "^1.2.3",
1717
"21torr/hosting": "^4.1.1",

src/Listener/MessengerEventListener.php

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Torr\TaskManager\Entity\TaskLog;
1111
use Torr\TaskManager\Model\TaskLogModel;
1212
use Torr\TaskManager\Normalizer\TaskDetailsNormalizer;
13+
use Torr\TaskManager\Task\DispatchAfterRunTask\DispatchAfterRunTask;
1314
use Torr\TaskManager\Task\Task;
1415

1516
/**
@@ -25,16 +26,17 @@ public function __construct (
2526
/**
2627
*
2728
*/
28-
#[AsEventListener(SendMessageToTransportsEvent::class)]
29+
#[AsEventListener]
2930
public function onSendMessageToTransports (SendMessageToTransportsEvent $event) : void
3031
{
31-
$taskLog = $this->getLogForEvent($event->getEnvelope());
32+
$envelope = $event->getEnvelope();
33+
$taskLog = $this->getLogForEvent($envelope);
3234

3335
// make sure that the log entry is created and flushed
3436
if (null !== $taskLog)
3537
{
3638
// update envelope with current version
37-
$taskLog->setTaskDetails($this->detailsNormalizer->normalizeTaskDetails($event->getEnvelope()));
39+
$taskLog->setTaskDetails($this->detailsNormalizer->normalizeTaskDetails($envelope));
3840

3941
$this->logModel->flush();
4042
}
@@ -43,18 +45,19 @@ public function onSendMessageToTransports (SendMessageToTransportsEvent $event)
4345
/**
4446
* Automatically integrate
4547
*/
46-
#[AsEventListener(WorkerMessageHandledEvent::class)]
48+
#[AsEventListener]
4749
public function onWorkerMessageHandled (WorkerMessageHandledEvent $event) : void
4850
{
49-
$taskLog = $this->getLogForEvent($event->getEnvelope());
51+
$envelope = $event->getEnvelope();
52+
$taskLog = $this->getLogForEvent($envelope);
5053

5154
if (null === $taskLog)
5255
{
5356
return;
5457
}
5558

5659
// update envelope with current version
57-
$taskLog->setTaskDetails($this->detailsNormalizer->normalizeTaskDetails($event->getEnvelope()));
60+
$taskLog->setTaskDetails($this->detailsNormalizer->normalizeTaskDetails($envelope));
5861

5962
// abort run as success. It wasn't marked as finished manually, but it succeeded nonetheless.
6063
$run = $taskLog->getLastUnfinishedRun();
@@ -63,18 +66,19 @@ public function onWorkerMessageHandled (WorkerMessageHandledEvent $event) : void
6366
$this->logModel->flush();
6467
}
6568

66-
#[AsEventListener(WorkerMessageFailedEvent::class)]
69+
#[AsEventListener]
6770
public function onWorkerMessageFailed (WorkerMessageFailedEvent $event) : void
6871
{
69-
$taskLog = $this->getLogForEvent($event->getEnvelope());
72+
$envelope = $event->getEnvelope();
73+
$taskLog = $this->getLogForEvent($envelope);
7074

7175
if (null === $taskLog)
7276
{
7377
return;
7478
}
7579

7680
// update envelope with current version
77-
$taskLog->setTaskDetails($this->detailsNormalizer->normalizeTaskDetails($event->getEnvelope()));
81+
$taskLog->setTaskDetails($this->detailsNormalizer->normalizeTaskDetails($envelope));
7882

7983
// abort run as failure. It wasn't marked as finished manually and it failed.
8084
$run = $taskLog->getLastUnfinishedRun();
@@ -90,7 +94,7 @@ private function getLogForEvent (Envelope $envelope) : ?TaskLog
9094
{
9195
$message = $envelope->getMessage();
9296

93-
return $message instanceof Task
97+
return $message instanceof Task && !$message instanceof DispatchAfterRunTask
9498
? $this->logModel->getLogForTask($message)
9599
: null;
96100
}

src/Schedule/WrappedSchedule.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ public function every (
8181
#[\Override]
8282
public function getSchedule () : Schedule
8383
{
84-
dump("get internal schedule");
8584
return $this->schedule->getSchedule();
8685
}
8786
}

src/Task/DispatchAfterRunTask/DispatchAfterRunTaskHandler.php

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
namespace Torr\TaskManager\Task\DispatchAfterRunTask;
44

5+
use Symfony\Component\Console\Input\ArrayInput;
6+
use Symfony\Component\Console\Output\ConsoleOutput;
7+
use Symfony\Component\Console\Output\OutputInterface;
58
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
69
use Symfony\Component\Messenger\Stamp\TransportNamesStamp;
7-
use Torr\TaskManager\Director\TaskDirector;
10+
use Torr\Cli\Console\Style\TorrStyle;
811
use Torr\TaskManager\Manager\TaskManager;
912

1013
/**
@@ -16,7 +19,6 @@
1619
*/
1720
public function __construct (
1821
private TaskManager $taskManager,
19-
private TaskDirector $taskDirector,
2022
) {}
2123

2224
/**
@@ -25,9 +27,13 @@ public function __construct (
2527
#[AsMessageHandler]
2628
public function onDispatchAfterRunTask (DispatchAfterRunTask $task) : void
2729
{
28-
$run = $this->taskDirector->startRun($task);
30+
// DispatchAfterRun message should not use the task director, as we can't recreate the task ulid.
31+
$io = new TorrStyle(
32+
new ArrayInput([]),
33+
new ConsoleOutput(OutputInterface::VERBOSITY_NORMAL, true),
34+
);
2935

30-
$run->io->writeln(\sprintf(
36+
$io->writeln(\sprintf(
3137
"Redispatching task <fg=yellow>%s</>",
3238
$task->task::class,
3339
));
@@ -36,7 +42,7 @@ public function onDispatchAfterRunTask (DispatchAfterRunTask $task) : void
3642
? [new TransportNamesStamp($task->transportNames)]
3743
: [];
3844

39-
$this->taskManager->enqueue($task->task, $stamps);
40-
$run->finish(success: true);
45+
$wrappedTask = $task->task->withNewTaskUlid();
46+
$this->taskManager->enqueue($wrappedTask, $stamps);
4147
}
4248
}

src/Task/Task.php

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
public function __construct ()
1717
{
18-
$this->ulid = (new Ulid())->toBase58();
18+
$this->ulid = new Ulid()->toBase58();
1919
}
2020

2121
/**
@@ -31,14 +31,8 @@ abstract public function getMetaData () : TaskMetaData;
3131
*/
3232
public function withNewTaskUlid () : static
3333
{
34-
if (\function_exists("clone") && \PHP_VERSION_ID >= 80500)
35-
{
36-
return clone($this, [
37-
"ulid" => (new Ulid())->toBase58()
38-
]);
39-
}
40-
41-
// @todo remove fallback + if above, when PHP 8.5 is required
42-
return $this;
34+
return clone($this, [
35+
"ulid" => new Ulid()->toBase58(),
36+
]);
4337
}
4438
}

tests/Task/TaskTest.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace Tests\Torr\TaskManager\Task;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use Torr\TaskManager\Task\Task;
7+
use Torr\TaskManager\Task\TaskMetaData;
8+
9+
/**
10+
* @internal
11+
*/
12+
final class TaskTest extends TestCase
13+
{
14+
/**
15+
*
16+
*/
17+
public function testNewTaskUlid () : void
18+
{
19+
// @phpstan-ignore-next-line 21torr.custom.task.suffix
20+
$task = new readonly class() extends Task {
21+
/**
22+
*
23+
*/
24+
#[\Override]
25+
public function getMetaData () : TaskMetaData
26+
{
27+
return new TaskMetaData("Test");
28+
}
29+
};
30+
31+
$initialUlid = $task->ulid;
32+
$newTask = $task->withNewTaskUlid();
33+
self::assertNotSame($initialUlid, $newTask->ulid, "Task ULID should change on PHP 8.4");
34+
}
35+
}

0 commit comments

Comments
 (0)