我在同一台机器上有一个制作人和经纪人。制作人发送消息如下:
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意味着经纪人将消息出列。
但是我的制作人如何才能了解消费者发送的确认?
答案 0 :(得分:5)
生产者和消费者通常不会互动。这是通过AMQP协议设计的。例如,消费特定消息可能在发布后很长时间内完成,并且让生产者长时间保持运行是没有意义的。另一个例子是当发布者向代理发送一条消息时,由于路由逻辑,消息被复制到多个队列,导致歧义(因为多个消费者可以确认相同的消息)。 AMQP协议是异步的(大多数情况下),让发布者了解其正在使用的消息只是不适合AMQP异步模型。
有一些例外,特别是RPC调用。然后生产者成为生产者 - 消费者。它发送一条消息,然后立即等待回复(有一个很好的RabbitMQ手册 - 与RabbtiMQ的RPC相关的Direct reply-to)。
通常,您可以确保将邮件与Confirms (aka Publisher Acknowledgements)以及Dead Letter Exchanges和Alternate Exchanges一起传递给代理。这些内容涵盖了大多数情况,在这些情况下,消息可能会从正常流程中丢失。