diff --git a/CHANGELOG.md b/CHANGELOG.md index 8beef81..b250a8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +4.1.0 +===== + +* (feature) Show "uses sync transport" info per task. + + 4.0.0 ===== diff --git a/src/Command/QueueTasksCommand.php b/src/Command/QueueTasksCommand.php index b38fb31..564989e 100644 --- a/src/Command/QueueTasksCommand.php +++ b/src/Command/QueueTasksCommand.php @@ -48,11 +48,6 @@ protected function execute (InputInterface $input, OutputInterface $output) : in $io = new TorrStyle($input, $output); $io->title("Task Manager: Queue Task"); - if ($this->receiverHelper->hasSyncTransport()) - { - $io->caution("The app is using sync transports: that means that registered tasks are directly worked on."); - } - try { [$tasksToQueue, $taskPassedExplicitly] = $this->getTasksToQueue($input, $io); @@ -172,21 +167,26 @@ private function fetchTasksByKey (array $keys) : array private function formatTaskLabel (Task $task) : string { $metaData = $task->getMetaData(); + $label = \sprintf( + "%s (%s)", + $metaData->label, + $metaData->getKey(), + ); if (null !== $metaData->group) { - return \sprintf( - "%s: %s (%s)", + $label = \sprintf( + "%s: %s", $metaData->group, - $metaData->label, - $metaData->getKey(), + $label, ); } - return \sprintf( - "%s (%s)", - $metaData->label, - $metaData->getKey(), - ); + if ($this->receiverHelper->usesSyncTransport($task)) + { + $label = \sprintf("[sync] %s", $label); + } + + return $label; } } diff --git a/src/Entity/TaskLog.php b/src/Entity/TaskLog.php index ab90918..b268be2 100644 --- a/src/Entity/TaskLog.php +++ b/src/Entity/TaskLog.php @@ -63,7 +63,7 @@ class TaskLog /** @var Collection */ #[ORM\OneToMany(mappedBy: "taskLog", targetEntity: TaskRun::class, cascade: ["remove"], orphanRemoval: true)] - #[ORM\OrderBy(["timeStarted" => "asc"])] + #[ORM\OrderBy(["timeStarted" => "ASC"])] public private(set) Collection $runs; /** diff --git a/src/Transport/TransportsHelper.php b/src/Transport/TransportsHelper.php index d2a87b7..a9d115a 100644 --- a/src/Transport/TransportsHelper.php +++ b/src/Transport/TransportsHelper.php @@ -2,12 +2,16 @@ namespace Torr\TaskManager\Transport; +use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; use Symfony\Component\DependencyInjection\ServiceLocator; +use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\Transport\Sender\SendersLocatorInterface; use Symfony\Component\Messenger\Transport\Sync\SyncTransport; use Symfony\Component\Messenger\Transport\TransportInterface; use Torr\TaskManager\Config\BundleConfig; use Torr\TaskManager\Exception\Transport\InvalidMessageTransportException; +use Torr\TaskManager\Task\Task; /** * Helper to interact with transports of the Symfony messenger component. @@ -24,6 +28,8 @@ public function __construct ( /** @var ServiceLocator */ private ServiceLocator $transports, private BundleConfig $bundleConfig, + #[Autowire(service: "messenger.senders_locator")] + private SendersLocatorInterface $sendersLocator, ) {} /** @@ -47,6 +53,32 @@ public function hasSyncTransport () : bool return false; } + /** + * @param Envelope|Task|object $message + */ + public function usesSyncTransport (object $message) : bool + { + if (!$message instanceof Envelope) + { + $message = new Envelope($message); + } + + foreach ($this->sendersLocator->getSenders($message) as $name => $transport) + { + if (self::INTERNAL_TRANSPORT_NAME === $name) + { + continue; + } + + if ($transport instanceof SyncTransport) + { + return true; + } + } + + return false; + } + /** * @return array */ diff --git a/tests/Manager/TaskManagerTest.php b/tests/Manager/TaskManagerTest.php index 6c3dc64..cb78386 100644 --- a/tests/Manager/TaskManagerTest.php +++ b/tests/Manager/TaskManagerTest.php @@ -9,6 +9,7 @@ use Symfony\Component\Messenger\Stamp\DeduplicateStamp; use Symfony\Component\Messenger\Stamp\StampInterface; use Symfony\Component\Messenger\Transport\Receiver\ListableReceiverInterface; +use Symfony\Component\Messenger\Transport\Sender\SendersLocatorInterface; use Symfony\Component\Messenger\Transport\TransportInterface; use Torr\TaskManager\Config\BundleConfig; use Torr\TaskManager\Manager\TaskManager; @@ -79,7 +80,11 @@ private function createManager (array $transports, MessageBusInterface $bus) : T $locator = new ServiceLocator($factories); $config = new BundleConfig(sortedQueues: array_keys($transports)); - $helper = new TransportsHelper($locator, $config); + $helper = new TransportsHelper( + $locator, + $config, + self::createStub(SendersLocatorInterface::class), + ); return new TaskManager($helper, $bus); } diff --git a/tests/Transport/TransportsHelperTest.php b/tests/Transport/TransportsHelperTest.php index 42724f5..b43b301 100644 --- a/tests/Transport/TransportsHelperTest.php +++ b/tests/Transport/TransportsHelperTest.php @@ -4,6 +4,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\DependencyInjection\ServiceLocator; +use Symfony\Component\Messenger\Transport\Sender\SendersLocatorInterface; use Torr\TaskManager\Config\BundleConfig; use Torr\TaskManager\Transport\TransportsHelper; @@ -33,7 +34,11 @@ public function testOrderedTransports () : void "scheduler_3" => static fn () => null, ]); - $helper = new TransportsHelper($locator, $config); + $helper = new TransportsHelper( + $locator, + $config, + self::createStub(SendersLocatorInterface::class), + ); self::assertSame([ "scheduler_1",