RabbitMQ 消费端限流
说明:
1. 消费端的确认模式一定要设置为手动确认, acknowledge="manual"。
2. 需要在application.yml中配置prefetch属性 prefetch:2 -- 设置消费端一次从Queue中读取两条消息。
1. 设置acknowledge确认模式和prefetch属性
spring:
rabbitmq:
host: 192.168.192.137
username: qmh
password: qmh
virtual-host: /qmh
port: 5672
listener:
simple:
# Consumer Ack
acknowledge-mode: manual
# 消费端一次从Queue中读取两条消息
prefetch: 2
2. 消费者接收消息
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;
/**
* 消费端限流
* 消费端的确认模式一定要设置为手动确认。acknowledge="manual"
* 需要在application.yml中配置prefetch属性 prefetch:2 -- 设置消费端一次从Queue中读取两条消息
*/
@Component
public class ListenerConsumerQos implements ChannelAwareMessageListener {
@Override
@RabbitListener(queues = "springboot_qos_queue")
public void onMessage(Message message, Channel channel) throws Exception {
Thread.sleep(1000);
long deliveryTag = message.getMessageProperties().getDeliveryTag();
try {
System.out.println(new String(message.getBody()));
/**
* 手动确认签收 basicAck(long deliveryTag, boolean multiple)
* deliveryTag 标签
* multiple 接收多条信息
*/
channel.basicAck(deliveryTag,true);
}catch (Exception e){
/**
* 签收失败 basicNack(long deliveryTag, boolean multiple, boolean requeue)
* deliveryTag 标签
* multiple 接收多条信息
* requeue true,消息重回Queue,broker重新发送该消息给消费者
*/
channel.basicNack(deliveryTag,true,true);
}
}
}