From 743bcefe4071069787900629f6454938f982732b Mon Sep 17 00:00:00 2001 From: Albert Chen Date: Wed, 8 Oct 2025 14:21:40 +0800 Subject: [PATCH] feat: register exception handler for coroutine drivers in queue --- src/queue/src/ConfigProvider.php | 2 +- src/queue/src/QueueManagerFactory.php | 34 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/queue/src/QueueManagerFactory.php diff --git a/src/queue/src/ConfigProvider.php b/src/queue/src/ConfigProvider.php index bcc60d3c..2c095e21 100644 --- a/src/queue/src/ConfigProvider.php +++ b/src/queue/src/ConfigProvider.php @@ -31,7 +31,7 @@ public function __invoke(): array return [ 'dependencies' => [ - FactoryContract::class => QueueManager::class, + FactoryContract::class => QueueManagerFactory::class, Queue::class => fn (ContainerInterface $container) => $container->get(FactoryContract::class)->connection(), FailedJobProviderInterface::class => FailedJobProviderFactory::class, Listener::class => fn (ContainerInterface $container) => new Listener($this->getBasePath($container)), diff --git a/src/queue/src/QueueManagerFactory.php b/src/queue/src/QueueManagerFactory.php new file mode 100644 index 00000000..ec954db5 --- /dev/null +++ b/src/queue/src/QueueManagerFactory.php @@ -0,0 +1,34 @@ +has(ExceptionHandler::class)) { + return $manager; + } + + $connectors = ['coroutine', 'defer']; + $reportHandler = fn (Throwable $e) => $container->get(ExceptionHandler::class)->report($e); + foreach ($connectors as $connector) { + try { + $manager->connection($connector) // @phpstan-ignore-line + ->setExceptionCallback($reportHandler); + } catch (InvalidArgumentException) { + // Ignore exception when the connector is not configured. + } + } + + return $manager; + } +}