为什么RabbitMQ读者会冲我的队列?

时间:2015-01-24 18:50:07

标签: rabbitmq

我有一些简单的代码可以将一些东西放在队列中:

val factory = new ConnectionFactory()
factory.setHost("localhost")
val connection = factory.newConnection()
val channel = connection.createChannel()
channel.basicPublish("", "myq", null, "AAA".getBytes()) 
channel.basicPublish("", "myq", null, "BBB".getBytes()) 
channel.basicPublish("", "myq", null, "CCC".getBytes()) 
channel.close()
connection.close()

这似乎有效。运行完之后,我可以做兔子的list_queues'并查看包含3个项目的myq。

现在(在另一个过程中)我运行阅读器代码从队列中抓取只有1个元素:

val factory = new ConnectionFactory()
factory.setHost("localhost")
val connection = factory.newConnection()
val channel = connection.createChannel()
channel.queueDeclare("myq", false, false, false, null)
val consumer = new QueueingConsumer(channel)
channel.basicConsume("myq", true, consumer)

// Grab just one message from queue
val delivery = consumer.nextDelivery()
val message = new String(delivery.getBody())

println(" [x] Received '" + message + "'")
channel.close()
connection.close()

这成功检索队列中的第一个项目(AAA)。但是......现在当我开始运行“兔子”时,list_queues'我在队列中看到0个项目,当然重新运行我的阅读器挂起/等待,因为队列现在是空的。为什么队列中的其他项目消失了?

1 个答案:

答案 0 :(得分:0)

您似乎没有使用basicQos。将basicQos设置为1,然后就可以实现所需,否则RabbitMQ会将预取设置视为无限制,并将所有消息(或尽可能多的消息)发送到首先执行basicConsume()的进程。 / p>

此处有更多信息:http://www.rabbitmq.com/tutorials/tutorial-two-java.html吼叫“Fair Dispatch”