options()); $config = $configuration->getConnection( $params->connection->value() ?? 'default' ); $queue = $this->getQueue($params); $this->connection = $connector->connect($config, $queue); $tag = $params->tag->value() ?? 'rabbitmq-laravel-consumer'; $consumer = function (AMQPMessage $message) use ($handler, $queue, $logger): void { try { $this->info(sprintf('Received message: %s', $message->getBody())); $mergedQueue = $this->getMergedQueue($queue, $message); $handler->handle($mergedQueue, $message); $message->ack(); $this->info('Message processed successfully.'); } catch (Exception $e) { $message->nack(); $this->error( sprintf('Processing error: %s', $e->getMessage()) ); $logger->error($e->getMessage()); } }; $this->connection->channel()->basic_consume( queue: $queue->name(), consumer_tag: $tag, callback: $consumer ); $this->connection->channel()->consume(); } public function __destruct() { $this->connection?->channel()->close(); $this->connection?->connection()->close(); } private function getQueue(ConsumerParameters $params): Queue { $routingKey = $params->routingKey->value() ?? ''; return new Queue( name: $params->queue->value() ?? 'default', exchange: new Exchange( name: $params->exchange->value() ?? 'amq.direct', type: $params->exchangeType->value() ?? 'direct', isDefault: $params->exchangeIsDefault->value(), declaration: new ExchangeDeclaration() ), declaration: new QueueDeclaration(), bindings: new QueueBindings($routingKey), ); } private function getMergedQueue(Queue $queue, AMQPMessage $message): Queue { return new Queue( name: $queue->name(), exchange: $queue->exchange(), declaration: $queue->declaration(), bindings: new QueueBindings( routingKey: $message->getRoutingKey(), nowait: $queue->bindings()->nowait(), arguments: $queue->bindings()->arguments(), ticket: $queue->bindings()->ticket() ), ); } }