2014-12-19 96 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一起发送给经纪人,该邮件涵盖大多数情况下可以使信息从正常流中丢失的信息。