* * * Where consumerName 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); } } }