public function testQueueConsumer() { $c = new AMQPPecl(AMQPCredentials::createDefault()); $channel = $c->createChannel(1); $channel->exchangeDeclare(self::EXCHANGE_NAME, AMQPExchangeConfig::create()->setType(new AMQPExchangeType(AMQPExchangeType::DIRECT))->setDurable(true)); $inQueueCount = $channel->queueDeclare(self::QUEUE_NAME, AMQPQueueConfig::create()->setDurable(true)); $this->assertSame(0, $inQueueCount); $channel->queueBind(self::QUEUE_NAME, self::EXCHANGE_NAME, self::ROUTING_KEY); //cleanup $channel->queuePurge(self::QUEUE_NAME); for ($i = 1; $i <= self::COUNT_OF_PUBLISH; $i++) { $channel->basicPublish(self::EXCHANGE_NAME, self::ROUTING_KEY, AMQPOutgoingMessage::create()->setBody("message {$i}")->setTimestamp(Timestamp::makeNow())->setAppId(__CLASS__)->setMessageId($i)->setContentEncoding('utf-8')); } $consumer = new AMQPTestCaseQueueConsumer($channel); $channel->basicConsume(self::QUEUE_NAME, false, $consumer); $i = 0; while (true) { $message = $consumer->getNextDelivery(); //send acknowledge to RabbitMQ $channel->basicAck($message->getDeliveryTag(), false); $i++; $this->assertSame($consumer->getConsumerTag(), $message->getConsumerTag()); $this->assertEquals($i, $message->getMessageId()); $this->assertEquals(__CLASS__, $message->getAppId()); $this->assertEquals("message {$i}", $message->getBody()); if ($i == self::COUNT_OF_PUBLISH) { break; } } $channel->basicCancel($consumer->getConsumerTag()); //observer logic test $this->assertSame('ABBBBBC', $consumer->getCheckString()); //drop channels and close connection $c->disconnect(); $c = new AMQPPecl(AMQPCredentials::createDefault()); $channel = $c->createChannel(1); $channel->exchangeDeclare(self::EXCHANGE_NAME, AMQPExchangeConfig::create()->setType(new AMQPExchangeType(AMQPExchangeType::DIRECT))->setDurable(true)); //queue must be empty, because we sent acknowledge $inQueueCount = $channel->queueDeclare(self::QUEUE_NAME, AMQPQueueConfig::create()->setDurable(true)); $this->assertSame(0, $inQueueCount); //cleanup $channel->queuePurge(self::QUEUE_NAME); }
/** * @throws AMQPServerException|AMQPServerConnectionException * @return AMQPChannelInterface **/ public function exchangeDeclare($name, AMQPExchangeConfig $conf) { $this->checkConnection(); if (!$conf->getType() instanceof AMQPExchangeType) { throw new WrongArgumentException("AMQP exchange type is not set"); } try { $this->exchangeList[$name] = new AMQPExchange($this->transport->getLink()); $obj = $this->exchangeList[$name]; $result = $obj->declare($name, $conf->getType()->getName(), $conf->getBitmask(new AMQPPeclExchangeBitmask())); } catch (AMQPExchangeException $e) { throw new AMQPServerException($e->getMessage(), $e->getCode(), $e); } $this->checkCommandResult($result, "Could not declare exchange"); return $this; }
/** * @param AMQPPeclChannel $channel * @param AMQPPeclChannel $label * @return AMQPPeclChannel */ protected function exchangeDeclare(AMQPChannelInterface $channel, $label) { $this->assertTrue(isset(self::$queueList[$label])); $interface = $channel->exchangeDeclare(self::$queueList[$label]['exchange'], AMQPExchangeConfig::create()->setType(new AMQPExchangeType(self::$queueList[$label]['exchangeType']))->setDurable(true)); $this->assertInstanceOf('AMQPChannelInterface', $interface); return $interface; }