public function run($type, callable $runCallback) { static $wrapperPassingRunCallback; if (!isset($wrapperPassingRunCallback)) { $wrapperPassingRunCallback = []; } if (is_null($this->consumerTag)) { $runCallbackWrapper = function (AMQPMessage $amqpMessage) use(&$wrapperPassingRunCallback) { $inputMessage = new InputMessage($amqpMessage->body); $runCallback = $wrapperPassingRunCallback['runCallback']; /** @var OutputMessage $outputMessage */ $outputMessage = $runCallback($inputMessage); $channel = $amqpMessage->delivery_info['channel']; if ($amqpMessage->has('reply_to')) { $replyQueueName = $amqpMessage->get('reply_to'); $id = $amqpMessage->get('correlation_id'); $replyAmqpMessage = new AMQPMessage($outputMessage->getData(), ['correlation_id' => $id]); $channel->basic_publish($replyAmqpMessage, '', $replyQueueName); } $channel->basic_ack($amqpMessage->delivery_info['delivery_tag']); }; $this->consumerTag = 'consumer_' . substr(Uuid::uuid4()->toString(), 0, 8); $this->channel->basic_qos(null, 1, null); $this->channel->basic_consume($this->getQueueName($type), $this->consumerTag, false, false, false, false, $runCallbackWrapper); } $wrapperPassingRunCallback['runCallback'] = $runCallback; $this->channel->wait(); unset($wrapperPassingRunCallback['runCallback']); }