RabbitMQ整合springboot

上节我们讲了rabbitmq的概念,原理,5种模式已经分别与Java进行整合,这节我们讲rabbitmq与springboot进行整合。(要提前准备好一个spring项目的基本框架)

整合时有两种方式创建交换机,队列及他们的绑定关系
1.添加配置类(加上@Configuration注解和@Bean注解)(topic模式,direct模式使用,也需要用到@RabbitListener,只起监听队列的作用)
2.用注解创建(@RabbitListener,注解中的内容比之增加,用来创建交换机,队列及他们的绑定关系,以及监听队列)

fanout模式

1.引入依赖

java 复制代码
<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

然后在spring项目中创建两个模块,一个生产者模块,一个消费者模块

2.在yml/properties文件进行相应的配置

分别在两个模块中都进行创建

java 复制代码
server:
  port: 8080
spring:
  application:
    name: RabbitMQ-demo
    #rabbitmq配置
  rabbitmq:
    username: guest
    password: guest
    virtual-host: /
    host: 127.0.0.1
    port: 5672

3.创建配置类(创建相应的交换机与队列,且绑定关系)

分别在两个模块中都进行创建(防止一方没有配置类启动时报错

java 复制代码
package com.lx.producer.config;

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 {


    //创建一个fanout类型的交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        //第一个参数是交换机的名字,第二个是是否持久化,第三个是是否自动删除
        return new FanoutExchange("fanout_order_exchange",true,false);
    }


    //创建三个队列

    @Bean
    public Queue smsQueue(){
        return new Queue("sms.fanout.queue",true);
    }

    @Bean
    public Queue duanxinQueue(){
        return new Queue("duanxin.fanout.queue",true);
    }

    @Bean
    public Queue emailQueue(){
        return new Queue("email.fanout.queue",true);
    }




    //三个队列分别进行绑定关系
    @Bean
    public Binding smsBinding(){
        return BindingBuilder.bind(smsQueue()).to(fanoutExchange());

    }

    @Bean
    public Binding duanxinBinding(){
        return BindingBuilder.bind(duanxinQueue()).to(fanoutExchange());

    }

    @Bean
    public Binding emailBinding(){
        return BindingBuilder.bind(emailQueue()).to(fanoutExchange());

    }
}

4.编写业务代码

在生产者模块中的service层中创建相应的生产信息业务类

java 复制代码
package com.lx.producer.service;

import jakarta.annotation.Resource;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;

import java.sql.SQLOutput;
import java.util.UUID;

@Service
public class OrderService {

    @Resource
    RabbitTemplate rabbitTemplate;


    public void makeOrder(String userId,String productId,Integer numbers){
        String orderId= UUID.randomUUID().toString();
        System.out.println("订单生产成功:"+orderId);

        //通过MQ完成消息的发送

        String exchangeName="fanout_order_exchange";
        String routingKey="";
        rabbitTemplate.convertAndSend(exchangeName,routingKey,orderId);

    }
}

在消费者模块中创建3个相应的消费信息业务类

(注意:必须要在类上写上@RabbitListener注解,表示监听某个队列)

java 复制代码
package com.lx.consumer.service;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;


@Service
@RabbitListener(queues = {"duanxin.fanout.queue"})
public class FanoutDuanxinConsumer {

    @RabbitHandler
    public void receiveMessage(String message){
        System.out.println("duanxin.fanout---接收到的信息是:"+message);
    }
}
java 复制代码
package com.lx.consumer.service;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;


@Service
@RabbitListener(queues = {"email.fanout.queue"})
public class FanoutEmailConsumer {

    @RabbitHandler
    public void receiveMessage(String message){
        System.out.println("email.fanout---接收到的信息是:"+message);
    }

}
java 复制代码
package com.lx.consumer.service;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;


@Service
@RabbitListener(queues = {"sms.fanout.queue"})
public class FanoutSmsConsumer {
    @RabbitHandler
    public void receiveMessage(String message){
        System.out.println("sms.fanout---接收到的信息是:"+message);
    }
}

最后先启动rabbitmq,在启动两个项目,我们就能得到再消费者中得到生产者发送的消息了

direct模式

direct模式与fanout模式的代码差不多,只是要把配置类和生产者的业务处理类修改一下

配置类修改如下(把刚刚fanout命名都改为direct了)

java 复制代码
package com.lx.producer.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class RabbitMqConfiguration {


    //创建一个direct类型的交换机
    @Bean
    public DirectExchange directExchangeExchange(){
        //第一个参数是交换机的名字,第二个是是否持久化,第三个是是否自动删除
        return new DirectExchange("direct_order_exchange",true,false);
    }


    //创建三个队列

    @Bean
    public Queue smsQueue(){
        return new Queue("sms.direct.queue",true);
    }

    @Bean
    public Queue duanxinQueue(){
        return new Queue("duanxin.direct.queue",true);
    }

    @Bean
    public Queue emailQueue(){
        return new Queue("email.direct.queue",true);
    }




    //三个队列分别进行绑定关系
    @Bean
    public Binding smsBinding(){
        return BindingBuilder.bind(smsQueue()).to(directExchangeExchange()).with("sms");

    }

    @Bean
    public Binding duanxinBinding(){
        return BindingBuilder.bind(duanxinQueue()).to(directExchangeExchange()).with("duanxin");

    }

    @Bean
    public Binding emailBinding(){
        return BindingBuilder.bind(emailQueue()).to(directExchangeExchange()).with("email");

    }
}

改成穿件direct类型的交换机以及路由与队列绑定时加了key

生产者业务类

java 复制代码
package com.lx.producer.service;

import jakarta.annotation.Resource;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;

import java.sql.SQLOutput;
import java.util.UUID;


@Service
public class OrderService {

    @Resource
    RabbitTemplate rabbitTemplate;


    public void makeOrder(String userId,String productId,Integer numbers){
        String orderId= UUID.randomUUID().toString();
        System.out.println("订单生产成功:"+orderId);

        //通过MQ完成消息的发送

        String exchangeName="direct_order_exchange";
        String routingKey1="sms";
        String routingKey2="duanxin";
        rabbitTemplate.convertAndSend(exchangeName,routingKey1,orderId);
        rabbitTemplate.convertAndSend(exchangeName,routingKey2,orderId);

    }
}

其余的代码不要变,把所有名字从fanout改为direct就行

topic模式

topic模式中我们使用注解的方式来创建交换机,队列以及它们之间的绑定关系,只需要把消费者业务代码及生产者业务代码修改下即可

消费者业务代码(修改@RabbitListener注解)

java 复制代码
package com.lx.consumer.service;

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Service;


@Service
@RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = "duanxin.topic.queue",durable = "true",autoDelete = "false"),
        exchange = @Exchange(value = "topic_order_exchange",type = ExchangeTypes.TOPIC),
        key = "#.duanxin.#"
))
public class TopicDuanxinConsumer {

    @RabbitHandler
    public void receiveMessage(String message){
        System.out.println("duanxin.topic---接收到的信息是:"+message);
    }
}
java 复制代码
package com.lx.consumer.service;

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Service;


@Service
@RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = "topic.email.queue",durable = "true",autoDelete = "false"),
        exchange = @Exchange(value = "topic_order_exchange",type = ExchangeTypes.TOPIC),
        key = "*.email.#"
))
public class TopicEmailConsumer {

    @RabbitHandler
    public void receiveMessage(String message){
        System.out.println("email.direct---接收到的信息是:"+message);
    }

}
java 复制代码
package com.lx.consumer.service;

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Service;


@Service
@RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = "sms.topic.queue",durable = "true",autoDelete = "false"),
        exchange = @Exchange(value = "topic_order_exchange",type = ExchangeTypes.TOPIC),
        key = "com.#"
))
public class TopicSmsConsumer {
    @RabbitHandler
    public void receiveMessage(String message){
        System.out.println("sms.direct---接收到的信息是:"+message);
    }
}

生产者业务代码(只修改routing keyj就行,通配符模式)

java 复制代码
package com.lx.producer.service;

import jakarta.annotation.Resource;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;

import java.sql.SQLOutput;
import java.util.UUID;


@Service
public class OrderService {

    @Resource
    RabbitTemplate rabbitTemplate;


    public void makeOrder(String userId,String productId,Integer numbers){
        String orderId= UUID.randomUUID().toString();
        System.out.println("订单生产成功:"+orderId);

        //通过MQ完成消息的发送

        String exchangeName="topic_order_exchange";
        String routingKey1="com.email.duanxin";
       // String routingKey2="duanxin";
        rabbitTemplate.convertAndSend(exchangeName,routingKey1,orderId);
       // rabbitTemplate.convertAndSend(exchangeName,routingKey2,orderId);

    }
}
相关推荐
赵丙双1 小时前
spring boot 排除自动配置类的方式和原理
java·spring boot·自动配置
bilI LESS2 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端
Chan162 小时前
MCP 开发实战:Git 信息查询 MCP 服务开发
java·开发语言·spring boot·git·spring·java-ee·intellij-idea
花千树-0104 小时前
Java 实现 ReAct Agent:工具调用与推理循环
java·spring boot·ai·chatgpt·langchain·aigc·ai编程
小信丶5 小时前
Spring MVC @SessionAttributes 注解详解:用法、场景与实战示例
java·spring boot·后端·spring·mvc
-南帝-5 小时前
RocketMQ2.3.5+SpringBoot 3.2.11+ java17安装-集成-测试案例
java·spring boot·rocketmq
wqww_16 小时前
springboot 使用websocket来记录移动人物坐标
spring boot·后端·websocket
小江的记录本6 小时前
【Docker】Docker系统性知识体系与命令大全(镜像、容器、数据卷、网络、仓库)
java·网络·spring boot·spring·docker·容器·eureka
花千树-0106 小时前
JMeter 入门与进阶指南:从零开始构建你的压测环境
java·spring boot·jmeter·性能优化·压力测试·可用性测试
Arthas2177 小时前
互联网大厂Java面试实战:从基础到架构的渐进式考察
java·spring boot·微服务·面试·技术栈