3分钟实现SpringBoot集成RabbitMQ,实现消息队列服务
共 4700字,需浏览 10分钟
·
2021-09-18 22:21
消息中间件在互联网公司使用的越来越多,主要用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息队列实现系统之间的双向解耦,生产者往消息队列中发送消息,消费者从队列中拿取消息并处理,生产者不用关心是谁来消费,消费者不用关心谁在生产消息,从而达到系统解耦的目的,也大大提高了系统的高可用性和高并发能力。
接下来介绍Spring Boot对RabbitMQ的支持。如何在SpringBoot项目中使用RabbitMQ?
Spring Boot提供了spring-bootstarter-amqp组件对消息队列进行支持,使用非常简单,仅需要非常少的配置即可实现完整的消息队列服务。
一、Spring Boot集成RabbitMQ
Spring Boot提供了spring-boot-starter-amqp组件,只需要简单的配置即可与Spring Boot无缝集成。下面通过示例演示集成RabbitMQ实现消息的接收和发送。
第一步,配置pom包。
创建Spring Boot项目并在pom.xml文件中添加spring-bootstarter-amqp等相关组件依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
在上面的示例中,引入Spring Boot自带的amqp组件spring-bootstarter-amqp。
第二步,修改配置文件。
修改application.properties配置文件,配置rabbitmq的host地址、端口以及账户信息。
spring.rabbitmq.host=10.2.1.231
spring.rabbitmq.port=5672
spring.rabbitmq.username=zhangweizhong
spring.rabbitmq.password=weizhong1988
spring.rabbitmq.virtualHost=order
在上面的示例中,主要配置RabbitMQ服务的地址。RabbitMQ配置由spring.rabbitmq.*配置属性控制。virtual-host配置项指定RabbitMQ服务创建的虚拟主机,不过这个配置项不是必需的。
第三步,创建消费者。
消费者可以消费生产者发送的消息。接下来创建消费者类Consumer,并使用@RabbitListener注解来指定消息的处理方法。示例代码如下:
@Component
public class Consumer {
@RabbitHandler
@RabbitListener(queuesToDeclare = @Queue("rabbitmq_queue"))
public void process(String message) {
System.out.println("消费者消费消息111=====" + message);
}
}
在上面的示例中,Consumer消费者通过@RabbitListener注解创建侦听器端点,绑定rabbitmq_queue队列。
(1)@RabbitListener注解提供了@QueueBinding、@Queue、@Exchange等对象,通过这个组合注解配置交换机、绑定路由并且配置监听功能等。
(2)@RabbitHandler注解为具体接收的方法。
第四步,创建生产者。
生产者用来产生消息并进行发送,需要用到RabbitTemplate类。与之前的RedisTemplate类似,RabbitTemplate是实现发送消息的关键类。示例代码如下:
@Component
public class Producer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void produce() {
String message = new Date() + "Beijing";
System.out.println("生产者产生消息=====" + message);
rabbitTemplate.convertAndSend("rabbitmq_queue", message);
}
}
如上面的示例所示,RabbitTemplate提供了 convertAndSend方法发送消息。convertAndSend方法有routingKey和message两个参数:
(1)routingKey为要发送的路由地址。
(2)message为具体的消息内容。发送者和接收者的queuename必须一致,不然无法接收。
最后,测试验证。
创建对应的测试类ApplicationTests,验证消息发送和接收是否成功。
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
Producer producer;
@Test
public void contextLoads() throws InterruptedException {
producer.produce();
Thread.sleep(1*1000);
}
}
在上面的示例中,首先注入生产者对象,然后调用produce()方法来发送消息。
最后,单击Run Test或在方法上右击,选择Run 'contextLoads()',运行单元测试程序,查看后台输出情况,结果如下图所示。
通过上面的程序输出日志可以看到,消费者已经收到了生产者发送的消息并进行了处理。这是常用的简单使用示例。
二、发送和接收实体对象
Spring Boot支持对象的发送和接收,且不需要额外的配置。下面通过一个例子来演示RabbitMQ发送和接收实体对象。
1. 定义实体类
首先,定义发送与接收的对象实体User类,代码如下:
public class User implements Serializable {
public String name;
public String password;
// 省略get和set方法
}
在上面的示例中,定义了普通的User实体对象。需要注意的是,实体类对象必须继承Serializable序列化接口,否则会报数据无法序列化的错误。
2. 定义消费者
修改Consumer类,将参数换成User对象。示例代码如下:
@Component
public class Consumer {
@RabbitHandler
@RabbitListener(queuesToDeclare = @Queue("rabbitmq_queue_object"))
public void process(User user) {
System.out.println("消费者消费消息111user=====name:" + user.getName()+",password:"+user.getPassword());
}
}
其实,消费者类和消息处理方法和之前的类似,只不过将参数换成了实体对象,监听rabbitmq_queue_object队列。
3. 定义生产者
修改Producer类,定义User实体对象,并通过convertAndSend方法发送对象消息。示例代码如下:
@Component
public class Producer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void produce() {
User user=new User();
user.setName("weiz");
user.setPassword("123456");
System.out.println("生产者生产消息111=====" + user);
rabbitTemplate.convertAndSend("rabbitmq_queue_object", user);
}
}
在上面的示例中,还是调用convertAndSend()方法发送实体对象。convertAndSend()方法支持String、Integer、Object等基础的数据类型。
4. 验证测试
创建单元测试类,注入生产者对象,然后调用produceObj()方法发送实体对象消息,从而验证消息能否被成功接收。
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
Producer producer;
@Test
public void testProduceObj() throws InterruptedException {
producer.produceObj();
Thread.sleep(1*1000);
}
}
最后,单击Run Test或在方法上右击,选择Run 'contextLoads()',运行单元测试程序,查看后台输出情况,运行结果如图12-8所示。
通过上面的示例成功实现了RabbitMQ发送和接收实体对象,使得消息的数据结构更加清晰,也更加贴合面向对象的编程思想。
推荐阅读:
SpringBoot入门系列(三十一) 实现静态文件、配置文件与jar分离
SpringBoot入门系列(三十)Spring Boot项目打包、发布与部署
SpringBoot入门系列(二十九)如何使用JdbcTemplate操作数据库?
SpringBoot入门系列(二十八)使用Redis实现分布式Session共享
Spring Boot入门系列(二十一) 如何优雅的设计Rest API版本号,实现API版本控制
Spring Boot入门系列(十九)集成mybatis,使用注解实现动态Sql、参数传递等常用操作!
Spring Boot入门系列(十八)mybatis 使用注解实现增删改查,无需xml文件
Spring Boot入门系列(十七)Mybatis创建自定义mapper 实现多表关联查询!
Spring Boot入门系列(十六)整合pagehelper,一秒实现分页功能!
Spring Boot入门系列(十五) SpringBoot开发环境热部署的配置
Spring Boot入门系列(十三)统一日志处理!
Spring Boot入门系列(十一)如何整合Mybatis,实现增删改查【XML 配置版】
Spring Boot入门系列(十)如何使用拦截器,一学就会!
SpringBoot入门系列(三)SpringBoot资源文件属性配置
SpringBoot入门系列(二)Controller介绍及如何返回json数据
SpringBoot入门系列(一)如何快速创建SpringBoot项