代码见:
链接:https://pan.baidu.com/s/11vmH2SK-aN2yvokt0juAQA
提取码:ormm
一:消费掉限流
场景:一些特殊时候在mq队列中累计大量的消息待处理,这时候启动客户端会导致客户端瞬间处理大量数据这时候有可能导致服务宕机。这里我们设置单次处理个数,直接在YML里配置即可:
#消费者最小数量
spring.rabbitmq.listener.simple.concurrency=1
#消费之最大数量
spring.rabbitmq.listener.simple.max-concurrency=10
#在单个请求中处理的消息个数,他应该大于等于事务数量(unack的最大数量)
spring.rabbitmq.listener.simple.prefetch=2
二:TTL队列
TTL队列又叫死信队列,通常用延迟队列,常见的场景就是例如购物平台的订单30分钟内支付等。死信队列中同一种过时时长必须一致。
1.配置
package com.rabbitmq.config;
import java.util.HashMap;
import java.util.Map;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 死信队列
* @author monxz
*
*/
@Configuration
public class RabbiteForDelayConfig {
/**
* 死信交换机
* @return
*/
@Bean
public DirectExchange delayExchange(){
return new DirectExchange("delay_exchange");
}
/**
* 死信队列
* @return
*/
@Bean
public Queue delayQueue(){
Map<String,Object> map = new HashMap<>(16);
map.put("x-dead-letter-exchange","receive_exchange");
map.put("x-dead-letter-routing-key", "receive_key");
return new Queue("delay_queue",true,false,false,map);
}
/**
* 给死信队列绑定交换机
* @return
*/
@Bean
public Binding delayBinding(){
return BindingBuilder.bind(delayQueue()).to(delayExchange()).with("delay_key");
}
/**
* 死信接收交换机
* @return
*/
@Bean
public DirectExchange receiveExchange(){
return new DirectExchange("receive_exchange");
}
/**
* 死信接收队列
* @return
*/
@Bean
public Queue receiveQueue(){
return new Queue("receive_queue");
}
/**
* 死信交换机绑定消费队列
* @return
*/
@Bean
public Binding receiveBinding(){
return BindingBuilder.bind(receiveQueue()).to(receiveExchange()).with("receive_key");
}
}
2.消费者
package com.rabbitmq.customer;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.rabbitmq.constant.MqConstant;
/**
* Topic模式消费者
* @author monxz
*
*/
@Component
public class DelayCustmer {
@RabbitListener(queues = "receive_queue")
public void receiveMsg1(String msg) {
System.out.println("队列1接收到消息:" + msg);
}
}
3.生产者
@GetMapping("/delay")
private Object testDelay() {
rabbitTemplate.convertAndSend(
"delay_exchange",
"delay_key",
"延迟消息",
message -> {
//注意这里时间要是字符串形式
message.getMessageProperties().setExpiration("6000");
return message;
}
);
return true;
}