RabbitMQ官网提供了七种队列模型,分别是:简单队列、工作队列、发布订阅、路由模式、主题模式、RPC模式、发布者确认模式。
本文在SpringBoot+RabbitMQ环境实现"简单队列"模式。
一、简单队列
特点:一个生产者,一个消费者。
二、在SpringBoot中的实现
首先我们新建2个springboot项目,一个 rabbitmq-provider (生产者),一个rabbitmq-consumer(消费者),springboot已经集成了RabbitMQ,直接引入spring-boot-starter-amqp。
> pom依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
> application.yml文件
spring:rabbitmq:host: IPport: 5672virtual-host: felix-vHostusername: long.yuanpassword: long.yuan
> 生产者-声明队列
/*** @Copyright (C), 2019-2020, 程序员耕耘* @ClassName: MQConnectionUtil* @Author: long.yuan* @E-mail: 18368916562@163.com* @Date: 2020/2/23 19:59* @Version: V1.0* @Description: RabbitMQ-队列配置类*/@Configurationpublic class RabbitConfig {/*** @Title 初始化Queue* @Description 创建一个名称为"felix-queue"的队列,其他参数使用默认* 在创建队列的时候如果要指定其他参数,Queue有多个构造方法可选择* @Author long.yuan* @Date 2020/2/23 22:43* @Param []* @return org.springframework.amqp.core.Queue**/@Beanpublic Queue felixQueue(){return new Queue("felix-queue");}}
> 生产者
/*** @Copyright (C), 2019-2020, 程序员耕耘* @ClassName: Publisher* @Author: long.yuan* @E-mail: 18368916562@163.com* @Date: 2020/2/23 19:59* @Version: V1.0* @Description: 生产者*/@Componentpublic class Publisher {@Autowiredprivate AmqpTemplate rabbitTemplate;/*** @Title 发送消息* @Description 发送消息* @Author long.yuan* @Date 2020/2/23 22:49* @Param []* @return void**/public void sendMessage() {String message = "简单队列-Hello World";System.out.println("发送消息 : " + message);rabbitTemplate.convertAndSend("felix-queue",message);}}
在简单队列模型中,发送消息的时候不指定交换机的名称,那么就会发送到"默认交换机"上。默认的Exchange不进行Binding操作,任何发送到该Exchange的消息都会被转发到"Queue名字和Routing key相同的队列"中,如果vhost中不存在和Routing key同名的队列,则该消息会被抛弃。
这里我们在发送消息的时候设置的Routing key为"felix-queue",那么就会发送到队列名字为"felix-queue"的队列上去。
> 测试类-发送消息
/*** @Copyright (C), 2019-2020, 程序员耕耘* @ClassName: Publisher* @Author: long.yuan* @E-mail: 18368916562@163.com* @Date: 2020/2/23 19:59* @Version: V1.0* @Description: 生产者测试类*/@RunWith(SpringRunner.class)@SpringBootTestpublic class PublishTest {@AutowiredPublisher publisher;@Testpublic void sendMessageTest() {publisher.sendMessage();}}
> 消费者
/*** @Copyright (C), 2019-2020, 程序员耕耘* @ClassName: Consumer* @Author: long.yuan* @E-mail: 18368916562@163.com* @Date: 2020/2/23 19:59* @Version: V1.0* @Description: 消费者*/@Component@RabbitListener(queues = "felix-queue")public class Consumer {/*** @RabbitListener 和 @RabbitHandler 搭配使用* @RabbitListener可以标注在类上面,需配合 @RabbitHandler 注解一起使用* 标注在类上面表示当有收到消息的时候,就交给 @RabbitHandler 的方法处理,* 具体使用哪个方法处理,根据接收到的 message 参数类型**/@RabbitHandlerpublic void process(String message) {System.out.println("消费成功 : " + message);}}
三、测试
首先运行test方法发送消息
登陆Mangerment界面,可以看到队列中阻塞了一条消息未消费
启动消费者项目,项目启动后会自动消费消息
队列中积压的消息被成功消费
感兴趣的小伙伴可以关注一下博主的公众号,1W+技术人的选择,致力于原创技术干货,包含Redis、RabbitMQ、Kafka、SpringBoot、SpringCloud、ELK等热门技术的学习&资料。













还没有评论,来说两句吧...