赞
踩
消息中间件最大的特点就是解耦:生产者只要把消息发送不去就可以不用管了,消费者不管在不在线都行,消费者上线的时候会来处理带消费的信息
- Publisher - 生产者:发布消息到RabbitMQ中的Exchange
- Consumer - 消费者:监听RabbitMQ中的Queue中的消息
- Exchange - 交换机:和生产者建立连接并接收生产者的消息
- Queue - 队列:Exchange会将消息分发到指定的Queue,Queue和消费者进行交互
- Routes - 路由:交换机以什么样的策略将消息发布到Queue
简单架构图
原理
:消息发送的时候,
1.先由生产者发送到消息交换机(有默认,可配置)
2.消息交换机根据既定的策略帮你把消息路由到不同的队列上面去(意味着消息收发的形式更加的多样
)
3.消息消费者就去监听不同的队列
完整架构图
目的
:方便日后多个项目关联及扩充
第一步
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit-test</artifactId> <scope>test</scope> </dependency>
spring.rabbitmq.host=1.12.235.192
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#虚拟主机,这个配置非常重要
spring.rabbitmq.virtual-host=/
package com.huang.config; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitConfig { public static final String MY_QUEUE_NAME_01= "hello-queue"; /** * 在Spring中,只需要将一个Queue对象注册到Spring容器中,RabbitMQ就会自动创建该队列 * @return */ @Bean Queue myQueue(){ /** * 1.队列的名字 我们这里为"hello-queue" * 2.队列是否持久化:RabbitMQ重启之后,队列是否还存在 我们这里设置为true,即队列存在 * 3.队列的排他性:这个为true,只有创建这个队列的连接才能给这个队列发消息 我们这里设置为false,即谁都可以给这个队列发消息 * 4.如果没有人消费这个队列,是否直接删除该队列 */ return new Queue(MY_QUEUE_NAME_01,true,false,false); } }
package com.huang.consumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class RabbitConsumer { private static final Logger logger = LoggerFactory.getLogger(RabbitConsumer.class); /** * @RabbitListener(queues = "hello-queue") * 通过这个注解,来指定该方法需要监听的消息队列,注解中的参数就是要去监听的消息队列的名称。 * @param msg */ @RabbitListener(queues = "hello-queue") public void handleMsg(String msg){ logger.info("msg:{}",msg); } }
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
spring.rabbitmq.host=1.12.235.192
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
//5672通信管理,15672界面管理
spring.rabbitmq.port=5672
spring.rabbitmq.virtual-host=/
@SpringBootTest class Producer01ApplicationTests { //这个就是一个消息发送模板 @Autowired RabbitTemplate rabbitTemplate; @Test void contextLoads() { /** * 1.消息队列的名字 * 2.要发送的消息内容 * 3. */ rabbitTemplate.convertAndSend(RabbitConfig.MY_QUEUE_NAME_01,"hello rabbitmq!"); } }
运行这个测试类去发送消息,消费者收到消息
java的生产者启动后,消费者控制台收到消息
RabbitMQ界面显示
1.Ready等待消费的消息数量
2.Unacked消息已经消费确认数量
3.totl是1和2的总和
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。