如果队列消息字节长度大于x-max-length-bytes,RabbitMQ如何处理?

时间:2015-06-26 13:03:37

标签: rabbitmq

我已经声明了如下的队列:

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时,它将自动删除队列头部的消息 但我的期望是拒绝产生最后的消息并将异常返回给制作人 我怎么能得到它?

2 个答案:

答案 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字段,然后决定是否发送。

希望有所帮助

修改

  1. 此解决方法可能会导致应用程序性能下降
  2. 如果您有多线程/更多发布者
  3. ,则此解决方法不安全
  4. 此解决方法不是一个非常“最佳实践”
  5. 试着看看你的申请是否合适。