12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\MessageQueue\Model;
- use Magento\Framework\MessageQueue\ConsumerFactory;
- use Magento\Framework\Exception\LocalizedException;
- use Magento\Framework\App\MaintenanceMode;
- use Magento\Framework\App\ObjectManager;
- /**
- * Consumer runner class is used to run consumer, which name matches the magic method invoked on this class.
- *
- * Is used to schedule consumers execution in crontab.xml as follows:
- * <code>
- * <job name="consumerConsumerName" instance="Magento\MessageQueue\Model\ConsumerRunner" method="consumerName">
- * </code>
- * Where <i>consumerName</i> should be a valid name of consumer registered in some queue.xml
- *
- * @api
- * @since 100.0.2
- */
- class ConsumerRunner
- {
- /**
- * @var ConsumerFactory
- */
- private $consumerFactory;
- /**
- * @var MaintenanceMode
- */
- private $maintenanceMode;
- /**
- * @var integer
- */
- private $maintenanceSleepInterval;
- /**
- * Initialize dependencies.
- *
- * @param ConsumerFactory $consumerFactory
- * @param MaintenanceMode $maintenanceMode
- * @param integer $maintenanceSleepInterval
- */
- public function __construct(
- ConsumerFactory $consumerFactory,
- MaintenanceMode $maintenanceMode = null,
- $maintenanceSleepInterval = 30
- ) {
- $this->consumerFactory = $consumerFactory;
- $this->maintenanceMode = $maintenanceMode ?: ObjectManager::getInstance()->get(MaintenanceMode::class);
- $this->maintenanceSleepInterval = $maintenanceSleepInterval;
- }
- /**
- * Process messages in queue using consumer, which name is equal to the current magic method name.
- *
- * @param string $name
- * @param array $arguments
- * @throws LocalizedException
- * @return void
- */
- public function __call($name, $arguments)
- {
- try {
- $consumer = $this->consumerFactory->get($name);
- } catch (\Exception $e) {
- $errorMsg = '"%callbackMethod" callback method specified in crontab.xml '
- . 'must have corresponding consumer declared in some queue.xml.';
- throw new LocalizedException(__($errorMsg, ['callbackMethod' => $name]));
- }
- if (!$this->maintenanceMode->isOn()) {
- $consumer->process();
- } else {
- sleep($this->maintenanceSleepInterval);
- }
- }
- }
|