2014-12-19 97 views
4

我在同一臺機器上有一個生產者和經紀人。生產者發送如下消息:rabbitmq amqp - 收聽來自消費者的ack消息

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); 
} 

從我的理解中,ACK是爲券商出隊的消息。

但是我的生產者怎麼才能知道消費者發送的消息?

回答

3

出版商和製作人通常不會互動。它是通過AMQP協議設計的。例如,具體的消息發佈可能會在發佈後很長時間內完成,並且沒有任何意義讓生產者長時間運行起來。另一個例子是,當發佈者發送給一個消息的代理時,並且由於路由邏輯,消息被複制到多個隊列中導致歧義。 AMQP協議是異步的(主要是),並且讓發佈者注意它被消費的消息只是不適合AMQP異步模型。

有一個例外 - RPC調用,然後生產者成爲生產者 - 消費者,當它發送消息,然後立即等待回覆(有一個很好的RabbitMQ手冊 - 與RabbtiMQ RPC相關的Direct reply-to)。

一般而言,您可以確保郵件以Confirms (aka Publisher Acknowledgements)Dead Letter ExchangesAlternate Exchanges一起發送給經紀人,該郵件涵蓋大多數情況下可以使信息從正常流中丟失的信息。