直连模式的缺点
当生产者生产消息过快,消费者消费过慢的情况下,会造成消息的大量堆积。因此这个时候就可以使用work模型:让多个消费者绑定到一个队列,共同消费队列中的消息。队列的消息一旦消费就不会存在,所以任务也是不会被重复执行的。
角色:
P: 生产者:任务的发布者
C1: 消费者1,领取任务并且完成任务,假设完成速度较慢
C2: 消费者2:领取任务并且完成任务,假设完成速度快。
创建提供者
package com.wang.rabbitmq.work;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.wang.rabbitmq.utils.RabbitMQUtils;
import java.io.IOException;
public class Provider {
public static void main(String[] args) throws IOException {
// 获取连接对象
Connection connection= RabbitMQUtils.getConnetion();
// 获取通道对象
Channel channel=connection.createChannel();
// 通过通道声明队列
/*
queue是 队列名称
durable 声明是否持久化
exclusive是否独占
autoDelete: 是否在队列为空的时候自动删除
arguments: 设置的队列的参数
*/
channel.queueDeclare("work",true,false,false,null);
// 生产消息
for(int i=0;i<10;i++){
channel.basicPublish("","work",null,(i+"hello work quenet").getBytes());
}
// 关闭通道和连接
RabbitMQUtils.closeConnectionAndChanel(channel,connection);
}
}
创建消费者1
package com.wang.rabbitmq.work;
import com.rabbitmq.client.*;
import com.wang.rabbitmq.utils.RabbitMQUtils;
import java.io.IOException;
public class consumer1 {
public static void main(String[] args) throws IOException {
Connection connection= RabbitMQUtils.getConnetion();
Channel channe=connection.createChannel();
channe.queueDeclare("work",true,false,false,null);
channe.basicConsume("work",true,new DefaultConsumer(channe){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者-1"+new String(body));
}
});
}
}