springboot整合消息队列——RabbitMQ

本文详细介绍了如何在SpringBoot项目中整合RabbitMQ,通过实例展示了fanout、direct和topic三种Exchange Type的使用。从启动RabbitMQ服务器开始,分别创建发送者和接收者应用,实现消息的发送和接收,具体包括配置文件设置、发送和接收类的编写。最后,展示了topic模式下如何进行消息广播和接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

  • 启动RabbitMQ

双击运行rabbitmq-server.bat

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

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

追加测试和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>

修改配置文件 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;
    }
}

创建一个配置类: 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);
    }
}

创建一个测试类: TestRabbitMQ.java

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

运行 testRabbit 方法:

创建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,结果:

信息成功被接收。

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

步骤与Direct差不多。

发送者:

修改配置类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.#");
}

修改发送类 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 方法:

成功广播出去两条信息

接收者:

修改接收类 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());
}

运行启动类,结果:

消息成功被发送接收

### Spring Boot 集成 RabbitMQ 确保消息不丢失的数据持久化配置 #### 1. 消息持久化 为了确保消息在传输过程中不会丢失,必须启用消息持久化功能。当消息被标记为持久化时,即使RabbitMQ服务器重启,这些消息也不会消失。这可以通过设置 `delivery_mode` 属性来完成[^4]。 ```java // 设置消息的 delivery_mode 为 PERSISTENT (2) message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); ``` #### 2. 队列持久化 除了消息本身外,队列也需要设定为持久化模式。这意味着即便发生故障或重启,队列中的数据仍然存在并能继续处理未完成的任务。创建队列时应指定其为持久化类型: ```java Queue queue = new Queue("persistent_queue", true); // 第二个参数表示是否持久化 ``` 此操作保证了即使遇到意外情况,如系统崩溃或者计划内的维护活动,队列结构及其内部的消息都不会受到影响[^1]。 #### 3. 发布确认机制 采用发布确认(publisher confirms)能够有效提高系统的健壮性和稳定性。通过这种方式可以在应用程序层面验证每条发出的信息确实已被成功接收并记录下来。一旦接收到Broker端返回的成功响应,则可认为该信息已经安全存入目标位置;反之则需采取相应措施重新尝试发送直至得到肯定答复为止。 #### 4. 消费者确认机制 对于消费者而言,实施手动ACK策略至关重要。只有当业务逻辑执行完毕后才向RabbitMQ反馈已读取状态,从而避免因程序异常终止而导致部分已完成工作未能及时更新的问题。此外还可以利用 nack 方法拒绝特定条件下的消息,并决定它们后续该如何处置——比如丢弃或是重回队首等待下次调度。 #### 5. 自动恢复连接与重试机制 考虑到网络波动等因素可能导致短暂性的通讯中断现象,在客户端初始化阶段应当激活自动重连特性以及合理规划最大尝试次数和间隔时间等参数值。这样做不仅有助于增强整体架构面对突发状况的能力,同时也减少了人工干预的需求频率。 #### 6. 启用交换机持久化 值得注意的是,不仅仅要关注队列和消息本身的持久性保障,还应该注意到用于路由转发指令流经路径上的各个组件同样需要具备相应的容错能力。因此建议同时开启Exchange级别的持久选项,使得整个通信链路更加稳固可靠[^2]。 综上所述,通过对上述几个方面的综合考量与实践应用,可以大大提升基于Spring Boot框架下构建的应用同RabbitMQ之间交互过程的安全系数和服务质量水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值