一、前言
- 请求瞬间增多,每秒5000个请求
二、生产者代码
-
创建RabbitMQ队列配置类com.example.rabbitmq_producer.config;
@Configuration public class RabbitMQConfig { //交换机名称 public static final String ITEM_EXCHANGE = "item_exchange"; //队列名称 public static final String ITEM_QUEUE = "item_queue"; //声明业务交换机 @Bean("itemExchange") public Exchange itemExchange(){ return ExchangeBuilder.directExchange(ITEM_EXCHANGE).durable(true).build(); } //声明业务队列 @Bean("itemQueue") public Queue itemQueue(){ return QueueBuilder .durable(ITEM_QUEUE) .build(); } //绑定队列和交换机(业务) @Bean public Binding itemQueueExchange(@Qualifier("itemQueue") Queue queue, @Qualifier("itemExchange") Exchange exchange){ return BindingBuilder.bind(queue).to(exchange).with("infoRouting").noargs(); } }
-
编写测试类,发送10条消息;
@SpringBootTest public class RabbitMQTest { @Autowired private RabbitTemplate rabbitTemplate; @Test public void test(){ //发送消息 for (int i = 0; i < 10; i++) { rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_EXCHANGE,"infoRouting","rabbitmq msg " + i ); } System.out.println("消息发送成功"); } }
三、消费者代码
-
配置文件
spring: rabbitmq: host: 127.0.0.1 port: 5672 username: nov17 password: nov17 virtual-host: testhost listener: simple: max-concurrency: 1 #每次最多拿一条消息 acknowledge-mode: manual #手动ACK
-
编写消息监听器com.example.rabbitmq_consumer.listener
@Component public class MyListener { @RabbitListener(queues = "item_queue") public void printMsg(String msg, Channel channel, Message message) throws IOException { //设置5秒的睡眠好看变化情况 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("消息处理成功:" + msg); // 手工ack channel.basicAck(message.getMessageProperties().getDeliveryTag(),false); } }
四、总结
-
concurrency配置属性设置消费端一次拉取多少消息
-
消费端的确认模式一定为手动确认。acknowledge=“manual”