通过学习,我们知道RabbitMQ遵循的是AMQP协议的。RabbitMQ的基础模型是生产者==> 通道 ==> 消费者。
在AMQP中生产者的流转过程如下:
//创建连接Connection
connection = connectionFactory.newConnection("生产者");
//通过连接获取通道Channel
channel =connection.createChannel();
//准备内容
String message = "Hello RabbitMQ";
channel.queueDeclare(queueName,false,false,false,null);
//发送消息给队列queue
channel.basicPublish("",queueName,null,message.getBytes());
//关闭资源
channel.close();
connection.close();
-
生产者连接到 RabbitMQ Broker , 建立一个连接( Connection ),开启一个信道( Channel ) 。
-
生产者声明一个交换器 ,并设置相关属性,比如交换机类型、是否持久化等。
-
生产者声明 一个队列井设置相关属性,比如是否排他、是否持久化、是否自动删除等 。
-
生产者通过路由键将交换器和队列绑定起来。
-
生产者发送消息至 RabbitMQ Broker,其中包含路由键、交换器等信息。
-
相应的交换器根据接收到的路由键查找相匹配的队列 。
-
如果找到,则将从生产者发送过来的消息存入相应的队列中。
-
如果没有找到 ,则根据生产者配置的属性选择丢弃还是回退给生产者。
-
关闭信道。
消费者的流转过程如下:
//创建连接Connection
connection = connectionFactory.newConnection("消费者");
//通过连接获取通道Channel
channel =connection.createChannel();
//通过创建交换机,声明队列,绑定关系,路由key,接收消息。
channel.basicConsume("queue1", true, new DeliverCallback() {
@Override
public void handle(String s, Delivery message) throws IOException {
System.out.println("收到消息====>" + new String(message.getBody(),"UTF-8"));
}
}, new CancelCallback() {
@Override
public void handle(String s) throws IOException {
System.out.println("接收失败了。。。。");
}
});
-
消费者连接到 RabbitMQ Broker,建立一个连接( Connection ),开启一个信道( Channel) 。
-
消费者向 RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数,以及做一些准备工作。
-
等待 RabbitMQ Broker 回应并投递相应队列中的消息,消费者接收消息。
-
消费者确认( ack )接收到的消息 。
-
RabbitMQ 从队列中删除相应己经被确认的消息 。
-
关闭信道。