Queue Length Limit
测试队列中最多只有5个消息,当第六条消息发送过来的时候,会删除最早的那条消息。队列中永远只有5条消息。
往这个队列发送消息,第一条消息为11,第二条为2222,第三条市3333,然后再发送的话就会将最先入队列的第一条消息删除,如果删除之后还是不够存储新的消息,依次删除第二个消息,循环如此。
使用代码声明含有x-max-length
和x-max-length-bytes
属性的队列
配置类
@Configuration
public class MQConfig {
@Bean
public ConnectionFactory connectionFactory(){
CachingConnectionFactory factory = new CachingConnectionFactory();
factory.setUri("amqp://zhihao.miao:123456@192.168.1.131:5672");
return factory;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
return rabbitAdmin;
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
return rabbitTemplate;
}
@Bean
public Queue queue1(){
Map<String, Object> arguments = new HashMap<>();
//表示队列中最多存放三条消息
arguments.put("x-max-length",3);
return new Queue("weixin",true,false,false,arguments);
}
@Bean
public Queue queue2(){
Map<String, Object> arguments = new HashMap<>();
//表示队列中最多存放三条消息
arguments.put("x-max-length-bytes",10);
return new Queue("eamil",true,false,false,arguments);
}
}
应用启动类
@ComponentScan
public class Application {
public static void main(String[] args) throws Exception{
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
RabbitTemplate rabbitTemplate = context.getBean(RabbitTemplate.class);
byte[] body = "hello".getBytes();
MessageProperties messageProperties = new MessageProperties();
messageProperties.setContentType("json");
Message message = new Message(body,messageProperties);
rabbitTemplate.send("","weixin",message);
TimeUnit.SECONDS.sleep(30);
context.close();
}
}
启动程序发现管控台生成了具有这二种属性的队列。
总结
Max length
(x-max-length
) 用来控制队列中消息的数量。
如果超出数量,则先到达的消息将会被删除掉。
Max length bytes
(x-max-length-bytes
) 用来控制队列中消息总的大小。
如果超过总大小,则最先到达的消息将会被删除,直到总大小不超过x-max-length-byte
为止。