**前言:**如图先来看看RabbitMQ的几种模型
- P:生产者:任务的发布者
- C1:消费者-1,领取任务并且完成任务,假设完成速度较慢
- C2:消费者-2:领取任务并完成任务,假设完成速度快
- 消费者1
public class Customer1 {
public static void main(String[] args) throws IOException {
//获取连接对象
Connection connection = RabbitMQUtils.getConnection();
final Channel channel = connection.createChannel();
channel.basicQos(1);//每一次只消费一个消息
channel.queueDeclare("work",true,false,false,null);
//参数1:队列名称 参数2:消息自动确认 true 消费者自动向rabbitMQ确认消息消费,false不会自动确认消息
channel.basicConsume("work",false,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
try{
Thread.sleep(2000);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("消费者-1"+new String(body));
//参数1确认队列中哪个具体的消息(标志),参数2是否开启多个消息同时确认
channel.basicAck(envelope.getDeliveryTag(),false);//手动确认
}
});
}
}
消费者2
public class Customer2 {
public static void main(String[] args) throws IOException {
//获取连接对象
Connection connection = RabbitMQUtils.getConnection();
final Channel channel = connection.createChannel();
channel.basicQos(1);//每次只消费一个消息
channel.queueDeclare("work",true,false,false,null);
channel.basicConsume("work",false,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者-2"+new String(body));
//参数1确认队列中哪个具体的消息(标志),参数2是否开启多个消息同时确认
channel.basicAck(envelope.getDeliveryTag(),false);//手动确认
}
});
}
}
生产者
public class Provider {
public static void main(String[] args) throws IOException {
//获取连接对象
Connection connection = RabbitMQUtils.getConnection();
//拿到通道
Channel channel = connection.createChannel();
//通过通道申明队列
channel.queueDeclare("work",true,false,false,null);
//生产消息
for(int i = 0;i<10;i++){
channel.basicPublish("","work",null,(i+"hello Work guent").getBytes());
}
//关闭资源
RabbitMQUtils.closeConnectionAndChanel(channel,connection);
}
}
启动消费者 生产者运行结果如下
可以看出,消费者1线程睡眠2秒执行慢,消费者2执行快,能者多劳
结合代码方法参数注释学习