- 其他代码和简单队列一致,但是消费者不一样。channel.basicQos可以控制消费者从队列中获取消息的能力,只要达到了这个值数量的消息未被ack,则不再给这个消费者发送消息,这个可以控制机器的消费能力,可以看到开了线程休眠的明显获取数据能力要比没开的弱很多。
public void getRabbitMessage1() throws IOException {
logger.info("消息监听器初始化成功");
Connection connection = RabbitConnectUtils.getRabbitConnection();
Channel channel = connection.createChannel();
// 声明队列
channel.queueDeclare(HELLO_QUEUE, false, false, false, null);
channel.basicQos(10);
// 定义队列的消费者
// 监听队列
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body) throws IOException {
String message = new String(body, "UTF-8");
try {
Thread.sleep(10);
logger.info("[x] receve:{}", message);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//手动回复一次
channel.basicAck(envelope.getDeliveryTag(), false);
}
}
};
// 自动回复确认,默认为true,生产者已发送就会将其标记为:已删除
channel.basicConsume(HELLO_QUEUE, false, consumer);
}