rabbitmq amqp - 收听消费者的ack消息

时间:2014-12-19 20:23:21

标签: rabbitmq amqp producer-consumer

我在同一台机器上有一个制作人和经纪人。制作人发送消息如下:

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意味着经纪人将消息出列。

但是我的制作人如何才能了解消费者发送的确认?

1 个答案:

答案 0 :(得分:5)

生产者和消费者通常不会互动。这是通过AMQP协议设计的。例如,消费特定消息可能在发布后很长时间内完成,并且让生产者长时间保持运行是没有意义的。另一个例子是当发布者向代理发送一条消息时,由于路由逻辑,消息被复制到多个队列,导致歧义(因为多个消费者可以确认相同的消息)。 AMQP协议是异步的(大多数情况下),让发布者了解其正在使用的消息只是不适合AMQP异步模型。

有一些例外,特别是RPC调用。然后生产者成为生产者 - 消费者。它发送一条消息,然后立即等待回复(有一个很好的RabbitMQ手册 - 与RabbtiMQ的RPC相关的Direct reply-to)。

通常,您可以确保将邮件与Confirms (aka Publisher Acknowledgements)以及Dead Letter ExchangesAlternate Exchanges一起传递给代理。这些内容涵盖了大多数情况,在这些情况下,消息可能会从正常流程中丢失。