/**
  * Create consumer.
  */
 private function initialize()
 {
     $this->messages = [];
     list($queue) = $this->channel->queue_declare('', false, false, true, true);
     $this->channel->queue_bind($queue, $this->exchange);
     $this->channel->basic_consume($queue, '', false, false, false, false, function (AMQPMessage $message) {
         $this->messages[] = $message;
         $this->channel->basic_cancel($message->delivery_info['consumer_tag']);
     });
 }
 /**
  * Listener for the queue
  * @param string $consumer_url
  * @param array $post_vars
  */
 public function consume($consumer_url, $post_vars = array())
 {
     $this->consumer_url = $consumer_url;
     $this->consumer_post = $post_vars;
     if ($this->consumer_count < $this->consumer_max) {
         $this->consumer_start = time();
         $callback = function (AMQPMessage $message) {
             $post_vars = $this->consumer_post;
             $post_vars['url'] = $this->consumer_url;
             $post_vars['queue'] = $this->queue;
             $post_vars['message'] = $message->body;
             $response = $this->httpRequest->post($this->consumer_url, $post_vars);
             $code = $this->httpRequest->statusCode();
             if ($code == 200) {
                 $message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']);
             } else {
                 // log the error to a file
                 $log_message = $code . "\n\n";
                 $log_message .= $message->body . "\n\n";
                 $log_message .= print_r($message, true);
                 $log_message .= "\n\n\n";
                 $log_message .= print_r($response, true);
                 Log::error($log_message);
             }
             if ($this->consumer_start + $this->ttl < time()) {
                 $this->channel->basic_cancel($message->delivery_info['consumer_tag']);
             }
         };
         $this->channel->basic_consume($this->queue, '', false, false, false, false, $callback);
         while (count($this->channel->callbacks)) {
             $this->channel->wait();
         }
     }
 }
 /**
  * @param MessageInterface $message
  *
  * @throws ConnectorException
  */
 public function basicCancel(MessageInterface $message)
 {
     /** @var AMQPMessage $amqpMessage */
     $amqpMessage = $message->getOriginalMessage();
     if (!$amqpMessage instanceof AMQPMessage) {
         throw ConnectorException::invalidOriginalMessageType(AMQPMessage::class, get_class($message));
     }
     $this->channel->basic_cancel($amqpMessage->delivery_info['consumer_tag']);
     $this->logger->info(sprintf('Message consumption stopped!'));
 }
Example #4
0
 /**
  * Start listen queue for tasks
  *
  * @param int $processMessages max number of messages for processing
  *
  * @return Generator
  */
 public function work(int $processMessages = null) : Generator
 {
     $this->messagesProcessed = 0;
     while (count($this->channel->callbacks)) {
         $this->channel->wait();
         if ($this->lastResult instanceof Result) {
             (yield $this->lastResult);
             $this->lastResult = null;
             $this->messagesProcessed++;
         }
         if (null !== $processMessages && $this->messagesProcessed >= $processMessages) {
             break;
         }
     }
     $this->channel->basic_cancel($this->consumerTag);
 }
 /**
  * @return string
  */
 private function createReplyConsumer()
 {
     $tag = uniqid('reply-consumer-');
     $this->channel->basic_consume(self::REPLY_QUEUE, $tag, false, true, false, false, function (AMQPMessage $message) {
         if (!($id = $message->get('correlation_id'))) {
             return;
         }
         if (!isset($this->unresolved[$id])) {
             return;
         }
         $this->unresolved[$id]->setReply($message);
         unset($this->unresolved[$id]);
         if (empty($this->unresolved)) {
             $this->channel->basic_cancel($message->delivery_info['consumer_tag']);
             $this->consumer = null;
         }
     });
     return $tag;
 }
Example #6
0
 /**
  * Cancel a specific consumer.
  *
  * @param string $consumerId
  *
  * @return $this
  */
 public function cancelConsumer($consumerId)
 {
     $this->channel->basic_cancel($consumerId);
     return $this;
 }