springboot整合消息队列——RabbitMQ

简介: springboot整合消息队列——RabbitMQ

RabbitMQ常用的三种Exchange Type:fanout、direct、topic。

  1. fanout:把所有发送到该Exchange的消息投递到所有与它绑定的队列中。
  2. direct:把消息投递到那些binding key与routing key完全匹配的队列中。
  3. topic:将消息路由到binding key与routing key模式匹配的队列中。

这里基于springboot整合 消息队列 ,测试这三种Exchange。

1,启动RabbitMQ

双击运行rabbitmq-server.bat

SpringBoot整合RabbitMQ——Direct模式(默认模式)

创建springboot web项目——发送者 springboot-sender

2,追加测试和rabbitmq所需的依赖

<!-- 添加springboot对amqp的支持 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!--添加测试包-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>5.0.9.RELEASE</version>
</dependency>

3,修改配置文件 application.yml 或 application.properties:

server:
  port: 7001
spring:
  application:
    name: spirngboot-sender
    rabbitmq:
      host: 127.0.0.1
      port: 5672
      username: guest
      password: guest

发送的信息可以是 基本数据类型 也可以是 对象 ,这里创建一个用户对象

public class User implements Serializable{
    private String username;
    private String password;
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
}

4,创建一个配置类: SenderConfiguration.java

一个名为 queue1 的 队列

@Configuration
public class SenderConfiguration {
    @Bean
    public Queue directQueue() {
        return new Queue("queue1");
    }
}

创建一个发送信息类: SenderService.java

发送 user 对象给 queue1 队列

@Component
public class SenderService {
    @Autowired
    private AmqpTemplate template;
 
    public void sendUser() {
        User user=new User();
        user.setUsername("张三");
        user.setPassword("123456");
        template.convertAndSend("queue1",user);
    }
}

5,创建一个测试类: TestRabbitMQ.java

@SpringBootTest(classes=SpringbootSenderApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class TestRabbitMQ {
    @Autowired
    private SenderService senderService;
 
    @Test
    public void testRabbit() {
        senderService.sendUser();
    }
}

运行 testRabbit 方法:

6,创建springboot web项目——接收者 springboot-receiver

修改配置文件 application.yml 或 application.properties:

server:
  port: 7002
spring:
  application:
    name: spirngboot-receiver
    rabbitmq:
      host: 127.0.0.1
      port: 5672
      username: guest
      password: guest

添加接收类: ReceiverService.java

@Component
public class ReceiverService {
    @RabbitListener(queues="queue1")
    public void receiveUser(User user) {
        System.out.println("username:"+user.getUsername()+" password:"+user.getPassword());
    }
}

运行启动类:

SpringbootApplication.java,结果:

信息成功被接收。

7,SpringBoot整合RabbitMQ——Topic模式(模糊匹配)

步骤与Direct差不多。

发送者:

8,修改配置类SenderConfiguration.java:

创建两个队列 topic1,topic2,创建一个topic交换器,绑定交换机和队列以及绑定规则

@Test
public void testRabbit() {
    senderService.sendUser();
}@Bean(name="topic1")
public Queue topicQueue1() {
    return new Queue("topic1");
}
@Bean(name="topic2")
public Queue topicQueue2() {
    return new Queue("topic2");
}
 
@Bean
public TopicExchange exchange() {
    //创建一个topic交换器
    return new TopicExchange("topicExchange");
}
@Bean
Binding bindingExchangeTopic1(@Qualifier("topic1") Queue queueMessage, TopicExchange exchange) {
    //设置topic1绑定规则
    return BindingBuilder.bind(queueMessage).to(exchange).with("topic.queue");
}
@Bean
Binding bindingExchangeTopic2(@Qualifier("topic2") Queue queueMessages, TopicExchange exchange) { 
    //设置topic2绑定规则 *表示一个词,#表示零个或多个词
    return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");
}

9,修改发送类 SenderService.java :

User user=new User();
user.setUsername("张三");
user.setPassword("123456");
//发送给topicExchange的交换机
template.convertAndSend("topicExchange","topic.queue",user);
template.convertAndSend("topicExchange","topic.anyting",user);

运行 testRabbit 方法:

9,成功广播出去两条信息

接收者:

修改接收类 ReceiverService.java :

@RabbitListener(queues="fanout1")
public void receiveFanout1(User user) {
    System.out.println("队列:fanout1 username:"+user.getUsername()+" password:"+user.getPassword());
}
@RabbitListener(queues="fanout2")
public void receiveFanout2(User user) {
    System.out.println("队列:fanout2 username:"+user.getUsername()+" password:"+user.getPassword());
}

运行启动类,结果:

消息成功被发送接收。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
25天前
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
66 6
|
19天前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
23天前
|
消息中间件
解决方案 | 云消息队列RabbitMQ实践获奖名单公布!
云消息队列RabbitMQ实践获奖名单公布!
|
1月前
|
消息中间件 安全 Java
云消息队列RabbitMQ实践解决方案评测
一文带你详细了解云消息队列RabbitMQ实践的解决方案优与劣
65 6
|
30天前
|
消息中间件 存储 弹性计算
云消息队列RabbitMQ实践
云消息队列RabbitMQ实践
|
1月前
|
消息中间件 存储 监控
解决方案 | 云消息队列RabbitMQ实践
在实际业务中,网站因消息堆积和高流量脉冲导致系统故障。为解决这些问题,云消息队列 RabbitMQ 版提供高性能的消息处理和海量消息堆积能力,确保系统在流量高峰时仍能稳定运行。迁移前需进行技术能力和成本效益评估,包括功能、性能、限制值及费用等方面。迁移步骤包括元数据迁移、创建用户、网络打通和数据迁移。
64 4
|
2月前
|
消息中间件 监控 数据处理
解决方案 | 云消息队列RabbitMQ实践
解决方案 | 云消息队列RabbitMQ实践
52 1
|
1月前
|
消息中间件 监控 测试技术
云消息队列RabbitMQ实践 - 评测
根据反馈,对本解决方案的实践原理已有一定理解,描述整体清晰但需在消息队列配置与使用上增加更多示例和说明以助理解。部署体验中获得了一定的引导和文档支持,尽管文档仍有待完善;期间出现的配置文件错误及依赖库缺失等问题已通过查阅资料解决。设计验证展示了云消息队列RabbitMQ的核心优势,包括高可用性和灵活性,未来可通过增加自动化测试来提高系统稳定性。实践后,用户对方案解决问题的能力及适用场景有了明确认识,认为其具有实际生产价值,不过仍需在性能优化、安全性增强及监控功能上进行改进以适应高并发和大数据量环境。
42 0
|
4月前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
4月前
|
消息中间件 Java C语言
消息队列 MQ使用问题之在使用C++客户端和GBase的ESQL进行编译时出现core dump,该怎么办
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。