我有一些简单的代码可以将一些东西放在队列中:
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个项目,当然重新运行我的阅读器挂起/等待,因为队列现在是空的。为什么队列中的其他项目消失了?
答案 0 :(得分:0)
您似乎没有使用basicQos。将basicQos设置为1,然后就可以实现所需,否则RabbitMQ会将预取设置视为无限制,并将所有消息(或尽可能多的消息)发送到首先执行basicConsume()的进程。 / p>
此处有更多信息:http://www.rabbitmq.com/tutorials/tutorial-two-java.html吼叫“Fair Dispatch”