SpringBoot整合RabbitMQ -fanout模式

本文介绍了如何在SpringBoot应用中整合RabbitMQ,使用Fanout模式实现消息的广播。配置了RabbitMQ服务器连接,并创建了Fanout交换机,定义了多个队列进行绑定。在下单服务中,通过RabbitTemplate发送消息到交换机,消息会被广播到所有绑定的队列。测试代码展示了模拟用户下单并触发消息发送的过程。

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

SpringBoot整合RabbitMQ -fanout模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由于是使用真实的阿里云服务器所以需要配置一下rabbitMQ的服务配置yml
注:一定要在阿里云的安全组中开放5672端口

# 服务端口
server:
  port: 8080
# 配置rabbitmq服务
spring:
  rabbitmq:
    username: admin
    password: admin
    virtual-host: /
    host: 139.196.122.115
    port: 5672

在这里插入图片描述

模拟用户下单

package com.newer.rabbitmq.springbootorderrabbitmqproducer.service;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.UUID;

@Service
public class OrderService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * @deprecated :模拟用户下单
     * @param :[userid,productid,num]
     * @return: void
     */
    public void makeOrder(String userid,String productId,Integer num){
           //1.根据商品id查询库存是否充足
           //2.保存订单
           String orderId= UUID.randomUUID().toString();
        System.out.println("订单生成成功:"+orderId);
           //3.通过MQ来完成消息的分发
           //参数1:交换机 参数2:路由key/queue队列名称 参数3:消息内容
           String exchangeName="fanout_order_exchange";
           //由于是fanout模式所以不需要路由key
           String routingkey="";
           rabbitTemplate.convertAndSend(exchangeName,routingkey,orderId);
    }


}

配置类

package com.newer.rabbitmq.springbootorderrabbitmqproducer.config;

import com.rabbitmq.client.AMQP;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMqConfiguration {

    //1.声明注册fanout模式的交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("fanout_order_exchange",true,false);
    }
    //2.声明队列sms.fanout.queue email.fanout.queue,duanxin.fanout.queue
    @Bean
    public Queue smsQueue(){
        return new Queue("sms.fanout.queue");
    }
    @Bean
    public Queue emailQueue(){
        return new Queue("email.fanout.queue");
    }
    @Bean
    public Queue duanxinQueue(){
        return new Queue("duanxin.fanout.queue");
    }
    //3.完成绑定关系(完成交换机与队列之间的绑定关系)
    @Bean
    public Binding smsBinding(){
        return BindingBuilder.bind(smsQueue()).to(fanoutExchange());
    }
    @Bean
    public Binding emailBinding(){
        return BindingBuilder.bind(emailQueue()).to(fanoutExchange());
    }
    @Bean
    public Binding duanxinBinding(){
        return BindingBuilder.bind(duanxinQueue()).to(fanoutExchange());
    }

}

测试

package com.newer.rabbitmq.springbootorderrabbitmqproducer;

import com.newer.rabbitmq.springbootorderrabbitmqproducer.service.OrderService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringbootOrderRabbitmqProducerApplicationTests {

	@Autowired
	private OrderService orderService;
	@Test
	void contextLoads() {
		orderService.makeOrder("1","1",12);
	}

}

在这里插入图片描述
在这里插入图片描述
然后我们看一下他们之间的绑定关系绑定上没
在这里插入图片描述
小结:通过springboot整合Rabbitmq是非常便捷的

### Spring Boot 集成 RabbitMQ 交换机与队列的工厂初始化实现 在 Spring Boot 中,可以通过声明式的配置类来完成 RabbitMQ 的交换机、队列以及绑定关系的初始化。以下是具体的实现方式: #### 添加依赖 为了支持 RabbitMQ 功能,在项目的 `pom.xml` 文件中需引入以下 Maven 依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 此依赖会自动导入 RabbitMQ 所需的核心库和 Spring AMQP 支持[^2]。 #### 创建配置类 通过定义一个 Java 配置类,可以利用 Spring 提供的 Bean 定义机制来初始化交换机、队列及其绑定关系。下面是一个完整的示例代码: ```java import org.springframework.amqp.core.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMqConfig { // 定义队列 @Bean public Queue myQueue() { return new Queue("my.queue", true, false, false); } // 定义交换机 @Bean public TopicExchange myExchange() { return new TopicExchange("my.exchange"); } // 绑定队列到交换机 @Bean public Binding binding(Queue myQueue, TopicExchange myExchange) { return BindingBuilder.bind(myQueue).to(myExchange).with("routing.key"); } } ``` 在此代码片段中,分别创建了一个持久化的队列 (`my.queue`) 和一个主题类型的交换机 (`my.exchange`) 并将其绑定在一起,指定路由键为 `"routing.key"`[^3]。 #### 工厂模式下的自定义初始化 如果需要更复杂的逻辑控制或者动态参数化,则可通过继承默认的工厂类来自定义行为。例如,重写 `DirectExchange`, `FanoutExchange`, 或者 `TopicExchange` 来满足特定业务场景的要求。 对于高级特性如 **死信队列 (DLQ)** ,也可以通过扩展的方式实现: ```java @Bean public Queue deadLetterQueue() { Map<String, Object> args = new HashMap<>(); args.put("x-dead-letter-exchange", "dlx.exchange"); // 死信转发的目标交换机名称 args.put("x-message-ttl", 60000); // 设置消息存活时间(ms),超时进入 DLX return new Queue("dead.letter.queue", true, false, false, args); } ``` 上述例子展示了如何基于参数化构造函数传递额外属性给队列实例,从而启用死信功能[^3]。 --- #### 性能优化建议 当面对高并发环境时,考虑调整线程池大小或预取计数等性能调优选项可能有助于提升吞吐量和服务稳定性。这些设置通常位于 application.properties/yml 文件下,比如: ```properties spring.rabbitmq.listener.simple.concurrency=5-10 spring.rabbitmq.listener.direct.prefetch=10 ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值