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

如果队列消息字节长度大于x-max-length-bytes,RabbitMQ如何处理?,rabbitmq,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); Map args=newhashmap(); args.put(“

我声明了一个队列,如下所示:

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);
Map args=newhashmap();
args.put(“x-max-length-bytes”,2*1024*1024);//最大长度为2G
channel.queueDeclare(“queueName”、true、false、false、args);
当队列消息计数字节大于2G时,它将自动删除队列头部的消息。
但我所期望的是,它拒绝生成最后一条消息,并将异常返回给生产者。

我怎样才能得到它?

正如官方文件所解释的:

一旦达到限制,消息将从队列前面丢弃或写上死信,以便为新消息腾出空间


如果您认为RabbitMQ应该从队列末尾删除消息,请随意在此处打开一个问题,以便我们可以讨论它

一个可能的解决方法是在使用发送消息之前检查队列大小

例如,如果您有一个名为:
myqueuetest
的队列,最大大小为20

在发送消息之前,您可以通过以下方式调用HTTP API:

结果是一个
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
  },
然后,在发送消息之前,请先读取
消息\u字节
字段,然后决定是否发送

希望能有帮助

编辑

  • 这种变通方法可能会降低应用程序的性能
  • 如果您有多线程/多个发布服务器,则此解决方案不安全
  • 这种变通方法不是一种“最佳实践”

  • 试着看看它是否适合您的应用程序。

    “返回异常”您是指生产者的异常吗?是的,您是对的。我的英语有点差。对不起,这是唯一的策略?是否有一种策略可以防止制作者在达到限制后继续制作消息。目前这是唯一的策略。请随意在Github上打开一个问题是的,这是一个解决方案。但在每次消息发送之前使用HTTP请求可能会影响效率。如果可以在RabbitMQ上进行配置,则可能会更好。RabbitMQ支持这样的配置吗?我们可以在内存中缓存
    消息\u字节
    ,以获得更好的性能。但它将变得更加复杂。所以如果RabbitMQ有配置可能会更好。请问@tangjiujun但是配置什么?正如我所写,这可能会扼杀性能。正如old_sound所写的,请随意打开一个问题。我认为这可能是RMQ的一个好特性。请原谅我的懒惰,你的答案满足了我的需要。谢谢但我希望通过RabbitMQ配置文件也能达到同样的效果。