2014-12-19 4 views
4

У меня есть производитель и брокер на той же машине. Производитель отправляет такие сообщения:rabbitmq amqp - прослушивание сообщений от потребителей

channel = connection.createChannel(); 

//Create a durable queue (if not already present) 
channel.queueDeclare(merchantId, true, false, false, null); 

//Publish message onto the queue 
channel.basicPublish("", consumerId, true, false, 
    MessageProperties.MINIMAL_PERSISTENT_BASIC, "myMessage"); 

Потребитель сидит на другой машине и слушает сообщения. Он использует явное подтверждение, как так:

while (true) { 
    QueueingConsumer.Delivery delivery = consumer.nextDelivery(); 
    //Handle message here 
    channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); 
} 

Из того, что я понимаю, извед предназначен для брокера DEQUEUE сообщения.

Но как мой производитель узнает о том, что потребитель отправил?

ответ

3

Издатель и производитель обычно не взаимодействуют. Это по протоколу AMQP. Например, конкретное потребление сообщений может быть сделано долгое время после его публикации, и нет смысла позволять продюсеру работать и работать в течение длительного времени. Другим примером является то, что издатель отправляет брокером одно сообщение и из-за логики маршрутизации это сообщение дублируется на несколько очередей, что приводит к неоднозначности. Протокол AMQP является асинхронным (в основном), и публикация издателя о том, что сообщение была потреблена, просто не соответствует модели асинхронного AMQP.

Есть исключения из этого - вызовы RPC, затем производитель становится производителем-потребителем, а он отправляет сообщение, а затем сразу ждет ответа (есть хорошее руководство RabbitMQ - Direct reply-to, связанное с RPC с RabbtiMQ).

В общем, вы можете обеспечить доставку сообщения брокеру с помощью Confirms (aka Publisher Acknowledgements) вместе с Dead Letter Exchanges и Alternate Exchanges, который охватывает большинство случаев, при которых сообщение может быть потеряно из него обычного потока.

Смежные вопросы