1>rabbitmq环境
通过docker构建的rabbitmq容器;docker-compose 文件如下所示,其中,环境变量配置了rabbitmq的用户名和密码;
version: '2'
services:
rabbitmq:
image: rabbitmq:management-alpine
container_name: rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=123456
ports:
- "15672:15672"
- "5672:5672"
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
然后通过docker-compose -f rabbitmq.yml up -d启动起来;其中15672是管理端的端口,5672是对外的api的端口;可以打开http://192.168.99.100:15672,提供了一些查看路由机,队列以及绑定的一些信息;
2>Springboot对rabbitmq的支持
rabbitmq是AMQP协议的一种实现;集成比较简单:、
1).首先引入jar包
compile "org.springframework.boot:spring-boot-starter-amqp"
2).配置文件
在Spring下面配置这几个
3).rabbitmq是通过消息的发送方不直接和队列进行数据传输,而是通过交换机,交换机根据路由键再通知到具体的队列;交换机有几种方式分别是Direct Exchange、Topic Exchange、Headers Exchange、Fanout Exchange;
先介绍下最简单的Direct Exchange的用法;
配置一个队列hello;
然后定义一个消息的发送方,往队列里面发送消息
定义一个或多个消费者,消费消息
这里经过测试会发现,多个消费者会均匀的消费消息;
接下来是用的比较多的topic的方式;增加两个队列,一个交换机,然后两个路由键和队列绑定起来;
注意的是,队列可以处理的消息是跟路由键有关系,topic.messages路由键是topic.#可以接受以topic开头的消息;而topic.message队列路由键是topic.message只能接受topic.message的消息;
下面写两个消息生产者
消费者
这里通过send1生产消息的时候,路由键是topic.message,那么队列topic.message匹配的路由键是topic.message;队列topic.messages匹配的路由键是topic.#,所以,两个队列都可以收到消息;
通过send2生产消息,则只有队列topic.messages可以收到消息;
最后是fanout模式,这种模式下不需要设置路由键,设置也会被忽略,所有绑定到某个交换机上的队列都可以收到消息,是一种广播的方式;
先定义三个度列和一个交换机,进行绑定,如下所示
再写一个生产者发送消息
最后是队列的处理消息代码
写个test方法,会发现这三个队列都会收到消息;fanout是一种广播的处理方式;