我已经声明了如下的队列:
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-max-length-bytes", 2 * 1024 * 1024); // Max length is 2G
channel.queueDeclare("queueName", true, false, false, args);
当队列消息计数字节大于2G时,它将自动删除队列头部的消息 但我的期望是拒绝产生最后的消息并将异常返回给制作人 我怎么能得到它?
答案 0 :(得分:0)
正如官方文件中所解释的那样:
一旦达到限制,将从队列前面删除或删除邮件,以便为新邮件腾出空间。
https://www.rabbitmq.com/maxlength.html
如果你认为RabbitMQ应该从队列的末尾删除消息,请随时在这里打开一个问题,以便我们讨论它https://github.com/rabbitmq/rabbitmq-server/issues
答案 1 :(得分:0)
可能的解决方法是在使用HTTP API发送邮件之前检查队列大小。
例如,如果您有一个名为myqueuetest
的队列,其最大大小为20。
在发送消息之前,您可以通过以下方式调用HTTP API: http://localhost:15672/api/queues/
结果是这样的JSON
:
"message_bytes":10,
"message_bytes_ready":10,
"message_bytes_unacknowledged":0,
"message_bytes_ram":10,
"message_bytes_persistent":0,
..
"name":"myqueuetest",
"vhost":"test",
"durable":true,
"auto_delete":false,
"arguments":{
"x-max-length-bytes":20
},
然后您在发送消息之前云阅读message_bytes
字段,然后决定是否发送。
希望有所帮助
修改强>
试着看看你的申请是否合适。