使用spring集成RabbitMQ

本文介绍了如何在SpringBoot项目中集成AMQPRabbitMQ,包括在pom.xml中引入依赖,配置连接信息,使用客户端发送和接收消息,工作模型中的多消费者处理,以及不同类型的交换机(如Fanout,Direct,Topic)的应用。还展示了如何声明队列、交换机和绑定关系的两种方式。
摘要由CSDN通过智能技术生成

1.基础使用

1.1在pom.xml文件中引入依赖

        <!--AMQP依赖,包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

1.2.在 配置文件中编写mq相关信息

spring:
  rabbitmq:
    host: 39.98.46.7            #ip
    port: 5673                  #端口号
    virtual-host: /test         #虚拟机名称
    username: guest             #用户名
    password: guest             #密码

1.3.使用客户端发送消息

向队列hello.queue1发送消息"hello,amqp!"(需要先将通道与队列绑定)

@Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    void testSendMessage2Queue() {
        String queueName = "hello.queue1";
        String msg = "hello, amqp!";
        rabbitTemplate.convertAndSend(queueName, msg);
    }

1.4.使用客户端接收信息

注解@RabbitListener能过同事监听多个队列,传入时使用数组即可。

@Component
public class MqListener {

    @RabbitListener(queues = "hello.queue1")
    public void listenHelloQueue1(String msg){
        System.out.println("监听到消息+【"+msg+"】");
    }
}

2.work模型

  • 多个消费者绑定到一个队列,可以加快消息处理速度
  • 同一条消息只会被一个消费者处理
  • 通过设置prefetch来控制消费者预取的消息数量,处理完一条再处理下一条,实现能者多劳

添加两个方法同时监听同一个队列,设置队列一每秒处理50条,队列二每秒处理5条

    @RabbitListener(queues = "work.queue")
    public void listenWorkQueue1(String msg) throws InterruptedException {
        System.out.println("消费者1 收到了 work.queue的消息:【" + msg +"】");
        Thread.sleep(20);
    }
//
    @RabbitListener(queues = "work.queue")
    public void listenWorkQueue2(String msg) throws InterruptedException {
        System.err.println("消费者2 收到了 work.queue的消息...... :【" + msg +"】");
        Thread.sleep(200);
    }

结果发现两队列处理速度不一样,但是依旧以轮询的方式处理消息

解决方法

在pom.xml文件中添加配置,使得只有处理完一个消息才能获取下一条消息

spring:
  rabbitmq:
    listener:
      simple:
        prefetch: 1 #每次只能获取一条消息,处理完才能获取下一条消息

3.交换机

3.1Fanout交换机

Fanout Exchange会将接收到的消息广播到每一个跟其绑定的queue,所以也叫广播模式。

3.2Direct交换机

DirectExchange会将接收到的消息根据规则路由到指定的Queue,因此称为定向路由

  • 每一个Queue都与Exchange设置一个BindingKey
  • 发布者发送消息时,指定消息的Routingkey
  • Exchange将消息路由到BindingKey与消息RoutingKey一致的队列

3.3Topic交换机

TopicExchange与DirectExchange类似,区别在于routingKey可以是多个单词的列表,并且以.分割。

Queue与Exchange指定BindingKey时可以使用通配符:

  • #:指定0个或多个单词
  • *:指定一个单词

4.声明队列与交换机

SpringAMQP提供了几个类,用来声明队列、交换机及其绑定关系:

  • Queue:用于声明队列,可以用工厂类QueueBuilder构建
  • Exchange:用于声明交换机,可以用工厂类ExchangeBuilder构建
  • Binding:用于声明队列和交换机的绑定关系,可以使用工厂类BindingBuilder构建

方式一:基于bean

//声明交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("hmall.fanout");
    }
    //声明队列1
   @Bean
    public Queue fanoutQueue1(){
        return new Queue("fanout.queue1");
   }
    //声明队列2
    @Bean
    public Queue fanoutQueue2(){
        return new Queue("fanout.queue2");
    }
    //将队列1与交换机绑定
    @Bean
    public Binding BindingQueue1(Queue fanoutQueue1, FanoutExchange fanoutExchange){
        return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }
    //将队列2与交换机绑定
    @Bean
    public Binding BindingQueue2(){
        return BindingBuilder.bind(fanoutQueue2()).to(fanoutExchange());
    }

方式二:基于注解

    @RabbitListener(bindings = @QueueBinding(exchange = @Exchange(name = "hmall.fanout"),
    value = @Queue(name = "fanout.queue1")))
    public void listenFanoutQueue1(String msg){
        System.out.println("fanout1收到消息:"+msg);
    }
    @RabbitListener(bindings = @QueueBinding(exchange = @Exchange(name = "hmall.fanout"),
            value = @Queue(name = "fanout.queue2")))
    public void listenFanoutQueue2(String msg){
        System.out.println("fanout2收到消息:"+msg);
    }

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot 集成 RabbitMQ 是一种常见的实践,用于在基于 Spring Boot 的应用程序中集成消息队列系统,RabbitMQ 是一个开源的消息中间件,常用于分布式系统的解耦和异步通信。 下面是简单的集成步骤: 1. 添加依赖:首先,你需要在你的 Maven 或 Gradle 项目中添加 RabbitMQ 客户端的依赖。对于 Maven,可以在 `pom.xml` 中添加: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 对于 Gradle,添加到 `build.gradle` 文件的 `dependencies` 节点: ```groovy implementation 'org.springframework.boot:spring-boot-starter-amqp' ``` 2. 配置 RabbitMQ:在 application.properties 或者 application.yml 文件中配置 RabbitMQ 的连接信息,如主机名、端口号、用户名和密码等: ```properties spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=admin spring.rabbitmq.password=password ``` 3. 创建消息生产者:使用 Spring 的 `RabbitTemplate` 类创建发送消息的方法,通常在服务中定义: ```java @Autowired private RabbitTemplate rabbitTemplate; public void sendMessage(String message) { rabbitTemplate.convertAndSend("queue-name", message); } ``` 4. 创建消息消费者:创建监听特定队列的消费者,可以是传统的 Java 接收器,也可以使用注解驱动(@RabbitListener)的方式: ```java @RabbitListener(queues = "queue-name") public void handleMessage(String message) { System.out.println("Received message: " + message); } ``` 5. 启动应用:运行 Spring Boot 应用,Spring Boot 自动会初始化 RabbitMQ 连接并注册你的消费者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值