SpringBoot2.x系列教程37--SpringBoot中整合RabbitMQ实现消息传递
前言
在上一篇文章中,壹哥 带大家搭建了RabbitMQ的开发环境。那么接下来,我们就按照之前的经验,先创建3个Web程序。一个用作消息生产者,一个作为消费者,还有一个作为存放通用代码类,并将之改造成Spring Boot项目,具体过程略。
整个项目的目录结构如下:
一. 创建存放通用代码的common项目
这个项目中很简单,只有一个User类,并将该类实现序列化。
package com.yyg.boot.domain; import lombok.Data; import lombok.ToString; import java.io.Serializable; /** * @Author 一一哥Sun * @Date Created in 2020/4/14 * @Description Description */ @Data @ToString public class User implements Serializable { private Long id; private String username; private String password; } 复制代码
二. 创建消息生产者项目
1. 添加依赖包
<!--amqp消息队列的依赖包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>com.yyg.boot</groupId> <artifactId>demo38_amqp_common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> 复制代码
2. 创建application.yml配置文件
spring: application: name: amqp-producer rabbitmq: host: localhost port: 5672 username: guest password: guest 复制代码
3. 创建队列配置
package com.yyg.boot.config; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Author 一一哥Sun * @Date Created in 2020/4/16 * @Description Description */ @Configuration public class RabbitMQConfig { //交换机和队列要进行绑定: //默认的交换机是DirectExchange, //每个交换机都需要利用路由键来和队列绑定在一起. //如果采用的是DirectExchange交换机,默认情况下,队里的名字就是路由键的名字. //该交换机是一对一的,一个消息被发送者发送出去之后,只能被一个消费者接受. @Bean public Queue queue(){ //firstRabbit,是队列的名字, return new Queue("firstRabbit"); } @Bean public Queue objectQueue(){ //firstRabbit,是队列的名字, return new Queue("firstObject"); } } 复制代码
4. 创建消息提供者
package com.yyg.boot.mq; import com.yyg.boot.domain.User; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Date; /** * @Author 一一哥Sun * @Date Created in 2020/4/16 * @Description Description */ @Slf4j @Component public class RabbitProducer { @Autowired private AmqpTemplate template; public void sendMsg() { //Message msg=new Message(); //template.send(msg); //第一个参数是路由键 String content="hello,"+new Date(); log.warn("消息发送--->content={}",content); template.convertAndSend("firstRabbit", content); } //发送对象 public void sendUser() { User user=new User(); user.setId(1L); user.setUsername("syc"); user.setPassword("123"); log.warn("消息发送--->User={}",user.toString()); template.convertAndSend("firstObject", user); } } 复制代码
5. 创建测试用例
package com.yyg.boot; import com.yyg.boot.mq.RabbitProducer; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; /** * @Author 一一哥Sun * @Date Created in 2020/4/16 * @Description Description */ @RunWith(SpringRunner.class) @SpringBootTest(classes = ProducerApplication.class) public class FirstRabbitTest { @Autowired private RabbitProducer producer; @Test public void firstSendTest() { for (int i = 0; i < 10; i++) { producer.sendMsg(); } } } 复制代码
6. 项目入口类
package com.yyg.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @Author 一一哥Sun * @Date Created in 2020/4/16 * @Description Description */ @SpringBootApplication public class ProducerApplication { public static void main(String[] args){ SpringApplication.run(ProducerApplication.class,args); } } 复制代码
7. 完整项目结构
8. 启动测试类
执行测试类中的firstSendTest()测试方法.看到控制台打印如下日志.
并且此时RabbitMQ中的firstRabbit队列中有10条待消费的消息。
三. 创建消息消费者模块
1. 创建application.yml配置文件
spring: application: name: amqp-consumer rabbitmq: host: localhost port: 5672 username: guest password: guest 复制代码
2. 创建消息消费者
利用@RabbitListener和@RabbitHandler这两个注解,实现消息接收的监听。
package com.yyg.boot.mq; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * @Author 一一哥Sun * @Date Created in 2020/4/16 * @Description Description */ @Slf4j @Component public class RabbitConsumer { @RabbitListener(queues = "firstRabbit") @RabbitHandler public void receiveMsg(String msg) { log.warn("接受消息---->content:{}", msg); } } 复制代码
3. 项目入口类
package com.yyg.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @Author 一一哥Sun * @Date Created in 2020/4/16 * @Description Description */ @SpringBootApplication public class ConsumerApplication { public static void main(String[] args){ SpringApplication.run(ConsumerApplication.class,args); } } 复制代码
4. 完整项目结构
5. 启动项目,接收消息
项目启动后,可以看到控制台打印如下消息。
此时可以看到,RabbitMQ控制台中firstRabbit队列中的消息已经被全部消费掉了,消息数量为0.
结语
至此,壹哥 就带大家简单实现了RabbitMQ的消息发送,后面还有更高级的功能,我们以后再学!
作者:一一哥Sun
链接:https://juejin.cn/post/7171944549898518564