我在同一台机器上生产商和经纪商。生产者发送消息如下所示:
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是为券商出队的消息。
但我的制片人怎么可以来了解ACK,消费者发送?
生产者和消费者通常不进行交互。这是通过AMQP协议设计。例如,消费特定消息可以这样做在发布后很长一段时间,并且在离开生产启动并运行了很长一段时间没有任何意义。另一个例子是,当发布者发送一个消息给代理,并且由于路由逻辑,其消息被复制到多个队列,导致歧义(因为多个消费者可以确认相同的消息)。 AMQP协议是异步的(大部分),并让发布商了解其信息被消耗只是不适合的AMQP异步模式。
有来自例外,值得注意的是,RPC调用。然后生产者变成了生产者 - 消费者。它发出了一个消息,然后立即等待答复(有很好的RabbitMQ手册 - Direct reply-to有关RPC与RabbtiMQ)。
在一般情况下,可以确保邮件传递给经纪人与Confirms (aka Publisher Acknowledgements)一起与Dead Letter Exchanges和Alternate Exchanges。那些包括大多数情况下它可以从它的正常流动会丢失的消息。