resource = $resource; $this->messageController = $messageController; $this->configuration = $configuration; $this->operationProcessor = $operationProcessorFactory->create( [ 'configuration' => $configuration ] ); $this->logger = $logger; $this->queue = $queue; $this->messageControllerDecorator = $messageControllerDecorator ?: ObjectManager::getInstance()->get(MessageControllerDecorator::class); } /** * Get transaction callback. This handles the case of async. * * @param EnvelopeInterface $message * @return void */ public function execute(EnvelopeInterface $message) { $queue = $this->queue; /** @var LockInterface $lock */ $lock = null; try { $topicName = $message->getProperties()['topic_name']; $lock = $this->messageControllerDecorator->lock($message, $this->configuration->getConsumerName()); $allowedTopics = $this->configuration->getTopicNames(); if (in_array($topicName, $allowedTopics)) { $this->operationProcessor->process($message->getBody()); } else { $queue->reject($message); return; } $queue->acknowledge($message); } catch (MessageLockException $exception) { $queue->acknowledge($message); } catch (ConnectionLostException $e) { if ($lock) { $this->resource->getConnection() ->delete($this->resource->getTableName('queue_lock'), ['id = ?' => $lock->getId()]); } } catch (NotFoundException $e) { $queue->acknowledge($message); $this->logger->warning($e->getMessage()); } catch (\Exception $e) { $queue->reject($message, false, $e->getMessage()); if ($lock) { $this->resource->getConnection() ->delete($this->resource->getTableName('queue_lock'), ['id = ?' => $lock->getId()]); } } } /** * Get message queue. * * @return QueueInterface */ public function getQueue() { return $this->queue; } }