diff --git a/vendor/magento/module-indexer/Model/ProcessManager.php b/vendor/magento/module-indexer/Model/ProcessManager.php index b6fd158364d..5e7382013de 100644 --- a/vendor/magento/module-indexer/Model/ProcessManager.php +++ b/vendor/magento/module-indexer/Model/ProcessManager.php @@ -7,6 +7,7 @@ declare(strict_types=1); namespace Magento\Indexer\Model; +use Magento\Framework\Amqp\ConfigPool as AmqpConfigPool; use Magento\Framework\App\ObjectManager; use Psr\Log\LoggerInterface; @@ -18,7 +19,7 @@ class ProcessManager /** * Threads count environment variable name */ - const THREADS_COUNT = 'MAGE_INDEXER_THREADS_COUNT'; + public const THREADS_COUNT = 'MAGE_INDEXER_THREADS_COUNT'; /** @var bool */ private $failInChildProcess = false; @@ -37,17 +38,24 @@ class ProcessManager */ private $logger; + /** + * @var AmqpConfigPool + */ + private AmqpConfigPool $amqpConfigPool; + /** * @param \Magento\Framework\App\ResourceConnection $resource * @param \Magento\Framework\Registry $registry * @param int|null $threadsCount * @param LoggerInterface|null $logger + * @param AmqpConfigPool|null $amqpConfigPool */ public function __construct( \Magento\Framework\App\ResourceConnection $resource, \Magento\Framework\Registry $registry = null, int $threadsCount = null, - LoggerInterface $logger = null + LoggerInterface $logger = null, + AmqpConfigPool $amqpConfigPool = null ) { $this->resource = $resource; if (null === $registry) { @@ -60,6 +68,7 @@ class ProcessManager $this->logger = $logger ?? ObjectManager::getInstance()->get( LoggerInterface::class ); + $this->amqpConfigPool = $amqpConfigPool ?? ObjectManager::getInstance()->get(AmqpConfigPool::class); } /** @@ -99,6 +108,8 @@ class ProcessManager private function multiThreadsExecute($userFunctions) { $this->resource->closeConnection(null); + $this->amqpConfigPool->closeConnections(); + $threadNumber = 0; foreach ($userFunctions as $userFunction) { // phpcs:ignore Magento2.Functions.DiscouragedFunction diff --git a/vendor/magento/framework-amqp/Config.php b/vendor/magento/framework-amqp/Config.php index fa0d9072c49..c4ac74778b5 100644 --- a/vendor/magento/framework-amqp/Config.php +++ b/vendor/magento/framework-amqp/Config.php @@ -165,11 +165,19 @@ class Config */ public function getChannel() { - if (!isset($this->connection) || !isset($this->channel)) { + if (!isset($this->connection)) { $this->connection = $this->createConnection(); - + } + if (!isset($this->channel) + || !$this->channel->getConnection() + || !$this->channel->getConnection()->isConnected() + ) { + if (!$this->connection->isConnected()) { + $this->connection->reconnect(); + } $this->channel = $this->connection->channel(); } + return $this->channel; } diff --git a/vendor/magento/framework-amqp/ConfigPool.php b/vendor/magento/framework-amqp/ConfigPool.php index c3d565bc996..f66d8ec9acb 100644 --- a/vendor/magento/framework-amqp/ConfigPool.php +++ b/vendor/magento/framework-amqp/ConfigPool.php @@ -43,4 +43,18 @@ class ConfigPool } return $this->pool[$connectionName]; } + + /** + * Close all opened connections. + * + * @return void + */ + public function closeConnections(): void + { + foreach ($this->pool as $config) { + $connection = $config->getChannel()->getConnection(); + $config->getChannel()->close(); + $connection?->close(); + } + } }