RabbitMQ(基础概念, 简单使用)(上):https://developer.aliyun.com/article/1518404
Spring AMQP
RabbitMQ 基于 AMQP 协议, 因此具有跨语言的特性.
Spring 官方基于 RabbitMQ 提供了一套消息收发管理工具 ---- Spring AMQP
Spring AMQP 提供的功能
- 自动声明队列、交换机及其绑定关系
- 基于注解的监听器模式,异步接收消息
- 封装了RabbitTemplate工具,用于发送消息
项目中使用 RabbitMQ
如果你很懒, 不想自己创建, 就去bilibili黑马的课程里, 找资源吧
(毕竟我也是在那里学的)
发送消息
创建项目, 导入依赖
项目目录结构
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--AMQP依赖,包含RabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!--单元测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> </dependencies>
添加一下配置
Spring 中发送消息
RabbitMQ 接收到消息
上面是使用管道简单的发送消息, 结构大概是这样
我们查看 的 convertAndSend 方法可以看到, 由于多态, 参数的选择有很多方案, 上面使用的是
convertAndSend(String routingKey, Object object)
因为所有的数据发送都是 Object , 因此我们接收方那里收到的, 也是 Object 类型, 如果想取出使用, 记得转换类型
接收消息
增加配置
编写监听代码
启动 consumer 类
publisher 中进行消息发送, 此时 consumer 中可以接收到消息
WorkQueues模型
简单的说就是多个消费者消费同一个队列中的消息
通常情况下, 队列会采用轮询的方式, 每个消费者均分 队列中的消息
两个消费者共同消费同一个队列
连续发送 50 条消息
查看结果会发现, 两个消费者虽然消费速率不同, 但是最终都消费了同样数量 (25条) 的消息
如何才能使得能者多劳, 不会浪费效率呐?
修改配置信息, 设定么个消费者每次获取消息的最大数量 (原先是 几个消费者 平均分掉 所有消息), 消费完成获取的消息之后才能获取下一条消息
引入交换机之后的 生产者消费者模型
注意: Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!
交换机的类型:
Fanout:广播,将消息交给所有绑定到交换机的队列。我们最早在控制台使用的正是Fanout交换机
Direct:订阅,基于RoutingKey(路由key)发送给订阅了消息的队列
Topic:通配符订阅,与Direct类似,只不过RoutingKey可以使用通配符
Headers:头匹配,基于MQ的消息头匹配,用的较少。
Fanout 交换机
交换机把消息发送给 所有 绑定该交换机的队列
创建交换机
创建两个队列并绑定
发送消息, 并接收处理
消息发送方
消息接收方
消息处理
可以看到, Fanout 交换机把消息 广播 给了绑定它的所有队列
RabbitMQ(基础概念, 简单使用)(下):https://developer.aliyun.com/article/1518411