目录
一. 概念
RabbitMQ 是一个消息中间件:它是一个面向消息中间件的开放式标准应用层协议(它不处理消息而是接收,存储和转发消息数据)
二. 四大核心概念
1.生产者
产生数据发送消息的程序是生产者
2.交换机
交换机在接收来自生产者的消息,要将消息推送到队列中。而且这个交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃
3.队列
Queue:队列,是 Rabbitmq的内部对象,是将消息以推送或者拉取方式给消费者进行消费
4.消费者
消费者,表示一个从消息队列中取得消息的客户端应用程序。
创建消息 路由键 pull/push
生产者------------>交换机------------>队列------------>消费者
三.docker安装rabbitmq
3.1 下载镜像
docker pull rabbitmq:management
3.2 运行镜像
设置用户名和密码
docker run -d \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
-v /data/rabbitmq:/var/lib/rabbitmq \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
--restart=always \
rabbitmq:management
参数说明:
-d:后台运行容器
-name:指定容器名
-p:指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号)
-v:映射目录或文件,启动了一个数据卷容器,数据卷路径为:/var/lib/rabbitmq,再将此数据卷映射到住宿主机的/data目录
--hostname:主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名)
-e:指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)
--restart=always:当Docker重启时,容器能自动启动
rabbitmq:management:镜像名
开启端口号
firewall-cmd --zone=public --add-port=5671/tcp --permanent
firewall-cmd --zone=public --add-port=15671/tcp --permanent
#重启防火墙(不重启以上的设置是不会生效的):
firewall-cmd --reload
3.3 查看是否可以进入
http://[虚拟机ip]/15672
四. springboot使用RabbitMQ
4.1 给pom.xml添加到rabbitmq依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
4.2 application.yml的连接配置
server:
port: 8001
spring:
rabbitmq:
host: 192.168.88.140
port: 5672
username: springboot
password: 123456
## 使用在docker安装rabbitmq时的虚拟机名字
virtual-host: my_vhost
4.3 创建直连交互机
@Configuration //可以把该类变成配置类
public class DirectExchangeConfig {
//1.创建队列
@Bean
public Queue directQueue(){
return new Queue("directQueue");
}
@Bean
public Queue directQueue1(){
return new Queue("directQueue1");
}
//2.创建交换机
@Bean
public DirectExchange directExchange(){
return new DirectExchange("directExchange");
}
//3.将队列通过路由键绑定到交换机中
@Bean
public Binding directBinding(){
return BindingBuilder.bind(directQueue()).to(directExchange()).with("directRouting");
}
@Bean
public Binding directBinding1(){
return BindingBuilder.bind(directQueue1()).to(directExchange()).with("directRouting1");
}
4.4 创建一个类,可以让生产者发送方法
@RestController
public class SendController {
//获取rabbitmq的消息发送模块
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping("/sendDirect")
public String sendDirectMessga(String msg){
rabbitTemplate.convertAndSend("directExchange","directRouting",msg);
rabbitTemplate.convertAndSend("directExchange","directRouting1",msg);
return msg+",消息发送成功";
}
}
通过指定路由键directRouting发送给交换机directExchange
交互机directExchange通过指定的路由键把消息msg投递到对应的队列上面去
4.5 启动生产者,就可以看见发送了两个消息过去
4.6 创建消费者,并启动
@Component
@RabbitListener(queues = {"directQueue","directQueue1"})
public class DirectRecevier {
@RabbitHandler
public void handleDirectMsg(String ss){
System.out.println(ss);
}
}
4.7 消息就消费掉了
@RabbitListener:表示把该类变成配置类
@RabbitHandler注解:指定对消息的处理
@Bean:把方法放到spring上下文里面去
@RabbitListener(queues = {"directQueue","directQueue1"}):这样就可以一次消费两条消息