如果队列消息字节长度大于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配置文件也能达到同样的效果。