1-2 RabbitMQ简介
初识RabbitMQ
- RabbitMQ是一个开源的消息代理和队列服务器
- 用来通过普通协议在完全不同的应用之间共享数据
- RabbitMQ是使用Erlang语言来编写的
- 并且RabbitMQ是基于AMQP协议的
RabbitMQ简介
- 目前很多互联网大厂都在使用RabbitMQ
- RabbitMQ底层采用Erlang语言进行编写
- 开源、性能优秀,稳定性保障
- 与SpringAMQP完美的整合、API丰富
- 集群模式丰富,表达式配置,HA模式,镜像队列模型
- 保证数据不丢失的前提做到高可靠性、可用性
- AMQP全称:Advanced Message Queuing Protocol
- AMQP翻译:高级消息队列协议
AMQP协议模型
1-3 RabbitMQ安装
https://blog.youkuaiyun.com/weixin_39735923/article/details/79288578
1-4 RabbitMQ概念
RabbitMQ的整体架构
RabbitMQ核心概念
- Server:又称Broker,接受客户端的连接,实现AMQP实体服务
- Connection:连接,应用程序与Broker的网络连接
-
Channel:网络信道
几乎所有的操作都在Channel中进行
Channel是进行消息读写的通道
客户端可建立多个Channel
每个Channel代表一个会话任务 -
Message:消息
服务器和应用程序之间传送的数据,由Properties和Body组成
Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性
Body则就是消息体内容 -
Virtual host:虚拟机
用于进行逻辑隔离,最上层的消息路由
一个Virtual host里面可以有若干个Exchange和Queue
同一个Virtual host里面不能有相同名称的Exchange或Queue - Exchange:交换机,接收消息,根据路由键转发消息到绑定的队列
- Binding:Exchange和Queue之间的虚拟连接,binding中可以包含routing key
- Routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定消息
- Queue:也称为Message Queue,消息队列,保存消息并将它们转发给消费者
RabbitMQ消息的流转过程
第二章:RabbitMQ使用
2-1 发送消息
SpringBoot与RabbitMQ集成
- 引入相关依赖
- 对application.properties进行配置
生产端代码
package com.example.spring.controller;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.support.CorrelationData;
import org.springframework.stereotype.Controller;
import com.example.spring.entity.Order;
@Controller
public class OrderSender {
private RabbitTemplate rabbitTemplate;
public OrderSender(
RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
public void send(Order order) {
//exchange:交换机
// routingKey:路由键
// message:消息体内容
// correlationData:消息唯一ID
CorrelationData correlationData = new CorrelationData();
correlationData.setId(order.getMessageId());
this.rabbitTemplate.convertAndSend("exchange", "order.b", order, correlationData);
}
}
2-2 接受消息
消费者部分代码:
package com.example.spring;
import com.example.spring.entity.Order;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* <br>
* 标题: 订单接收者<br>
* 描述: 订单接收者<br>
* 时间: 2018/10/5<br>
*
* @author wq
*/
@Component
public class OrderReceiver {
/**
* 接收消息
*
* @param order 消息体内容
* @param headers 消息头内容
* @param channel 网络信道
* @throws Exception 异常
*/
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "order.b",durable = "true"),
exchange = @Exchange(name = "exchange",type = "topic"),
key = "order.*"
))
@RabbitHandler
public void onOrderMessage(@Payload Order order, @Headers Map<String, Object> headers, Channel channel) throws Exception {
// 消费者操作
System.out.println("收到消息:");
System.out.println("订单信息:" + order.toString());
// 手动签收消息
Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
channel.basicAck(deliveryTag, false);
}
}
源码地址 : https://gitlab.com/openice/rabbitmq-producer.git
https://gitlab.com/openice/rabbitmq-consumer.git
文章 摘抄慕课网笔记 :地址 :https://segmentfault.com/a/1190000016326662