首页 > 其他分享 >Springboot整合RabbitMQ值Direct交换机

Springboot整合RabbitMQ值Direct交换机

时间:2023-11-08 18:14:02浏览次数:42  
标签:rabbitmq Springboot 队列 Direct RabbitMQ 交换机 springframework org import

常用的交换机有以下三种,因为消费者是从队列获取信息的,队列是绑定交换机的(一般),所以对应的消息推送/接收模式也会有以下几种:

Direct Exchange 

直连型交换机,根据消息携带的路由键将消息投递给对应队列。

大致流程,有一个队列绑定到一个直连交换机上,同时赋予一个路由键 routing key 。
然后当一个消息携带着路由值为X,这个消息通过生产者发送给交换机时,交换机就会根据这个路由值X去寻找绑定值也是X的队列。

Fanout Exchange

扇型交换机,这个交换机没有路由键概念,就算你绑了路由键也是无视的。 这个交换机在接收到消息后,会直接转发到绑定到它上面的所有队列。

Topic Exchange

主题交换机,这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键和绑定键之间是有规则的。
简单地介绍下规则:

*  (星号) 用来表示一个单词 (必须出现的)
#  (井号) 用来表示任意数量(零个或多个)单词
通配的绑定键是跟队列进行绑定的,举个小例子
队列Q1 绑定键为 *.TT.*          队列Q2绑定键为  TT.#
如果一条消息携带的路由键为 A.TT.B,那么队列Q1将会收到;
如果一条消息携带的路由键为TT.AA.BB,那么队列Q2将会收到;

主题交换机是非常强大的,为啥这么膨胀?
当一个队列的绑定键为 "#"(井号) 的时候,这个队列将会无视消息的路由键,接收所有的消息。
当 * (星号) 和 # (井号) 这两个特殊字符都未在绑定键中出现的时候,此时主题交换机就拥有的直连交换机的行为。
所以主题交换机也就实现了扇形交换机的功能,和直连交换机的功能。

另外还有 Header Exchange 头交换机 ,Default Exchange 默认交换机,Dead Letter Exchange 死信交换机

创建2个springboot项目,一个 rabbitmq-provider (生产者),一个rabbitmq-consumer(消费者)

1:创建好springboot项目,pom.xml添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2:application.properties文件里面添加mq的配置信息

# amqp
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456
spring.rabbitmq.virtual-host=/
# 队列交换机和路由键
rabbitmq.queue=my_queue
rabbitmq.exchange=my_exchange
rabbitmq.routing=my_direct_routing

3:新建DirectRabbitConfig配置类

 

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.amqp.core.Queue;

/**
 * @Desc Direct交换机配置类
 * @User Aiden
 * @DateTime: 2023-11-08 14:29
 * @Project: springboot
 */
@Configuration
public class DirectRabbitConfig {

    // 队列名称
    @Value("${rabbitmq.queue}")
    private String QueueName;
    // 交换机名称
    @Value("${rabbitmq.exchange}")
    private String ExchangeName = "my_exchange";
    // 路由匹配键
    @Value("${rabbitmq.routing}")
    private String DirectRoutingKey;

    /**
     * 队列
     * @return
     */
    @Bean
    public Queue TestDirectQueue(){
        return new Queue(QueueName,true);
    }

    /**
     * 交换机
     * @return
     */
    @Bean
    public DirectExchange TestDirectExchange(){
        return new DirectExchange(ExchangeName,true,false);
    }

    /**
     *  通过路由将队列和交换机绑定
     * @return
     */
    @Bean
    public Binding bindDirect(){
        return BindingBuilder.bind(TestDirectQueue()).to(TestDirectExchange()).with(DirectRoutingKey);
    }

    @Bean
    DirectExchange lonelyDirectExchange() {
        return new DirectExchange("lonelyDirectExchange");
    }
}

3:编写发送消息的接口,根据业务需要决定;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.UUID;

/**
 * @Desc 发送MQ消息
 * @User Aiden
 * @DateTime: 2023-11-08 14:57
 * @Project: springboot
 */
@RestController
public class MessageController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送消息
     * @return
     */
    @GetMapping("send/msg")
    public String sendMessage(){
        // 数据
        HashMap<String, String> map = new HashMap<>();
        map.put("msg_id",String.valueOf(UUID.randomUUID()));
        map.put("msg_body","你好");
        map.put("send_time", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        //将消息携带绑定键值:TestDirectRouting 发送到交换机TestDirectExchange
        rabbitTemplate.convertAndSend("my_exchange", "my_direct_routing", map);
        return "success";
    }

} 

在安装好的RabbitMQ server端,http://localhost:15672/#/ 就可以看到消息待消费;

5:消费消息,可以创建新项目,同样的配置和信息,创建消费方法:

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * @Desc 消费MQ消息
 * @User Aiden
 * @DateTime: 2023-11-08 17:35
 * @Project: springboot
 */
@Component
@RabbitListener(queues = "${rabbitmq.queue}")
@RestController
public class ConsumerController {

    @RabbitHandler
    public void directReceiver(Map message) {
        System.out.println(message.toString());
    }
}

6:启动项目,根据端口号打开 http://localhost:8082/send/msg 返回OK后,在IDEA控制台就可以看到消息的打印:

 

一个简单的整合流程就到此。 

 

  

  

 

标签:rabbitmq,Springboot,队列,Direct,RabbitMQ,交换机,springframework,org,import
From: https://www.cnblogs.com/guoyachao/p/17818021.html

相关文章

  • 跳转(Forward)和页面重定向(Redirect)的区别
    Redirect1.用户浏览器向http://localhost:8080/demo/start.xhtml发送GET请求。2.JSF收到请求,返回start.xhtml页面。3.用户点击页面中的按钮。4.JSF收到请求,向浏览器发送Redirect指令(3XX的HTTP状态值)。5.浏览器收到指令,发送另一个G......
  • Springboot项目出现Error resolving template [index]的解决方法
    在SpringBoot中遇到模板文件不存在的问题在SpringBoot开发中,有时候会遇到Errorresolvingtemplate[index],templatemightnotexist这个错误,一般来说,这个错误可能有以下几种原因:模板文件路径错误:需要确认模板文件是否存在,并且其路径是否正确。通常模板文件的路径应该是class......
  • springboot3.1.5+文件上传+文件下载
    idea创建项目springbootdemo-download-upload加上thymeleaf模板maven依赖application.properties配置#thymeleaf页面缓存设置(默认为true)spring.thymeleaf.cache=false#单个上传文件大小限制(默认1MB)spring.servlet.multipart.max-file-size=10MB#总上传文件大小限制(默......
  • springboot高版本(2.5以上)解决跨域问题
    版本说明springboot2.7.17原来代码importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.CorsRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration......
  • 运行Springboot测试类查询数据库数据显示白网页
    问题运行Springboot测试类时,查询数据库里面数据显示如下白网页程序报如下错误 解决方案 SpringBoot应用未能启动的原因是它没有找到合适的数据库配置具体来说,它需要一个数据源(DataSource),但未能在你的配置中找出,也没有找到任何嵌入式数据库(H2,HSQL或Derby)以下是几个......
  • SpringBoot集成文件 - 大文件的上传(异步,分片,断点续传和秒传)
    1.知识准备大文件的上传技术手段和普通文件上传是有差异的,主要通过基于分片的断点续传和秒传和异步上传解决。#1.1大文件面临的问题上传速度慢--应对: 分块上传上传文件到一半中断后,继续上传却只能重头开始上传--应对: 断点续传相同文件未修改再次上传,却只能重......
  • LINUX:Error while compiling statement: FAILED: RuntimeException Cannot create sta
    问题截图 可以看到是user=root,权限不够导致 观察发现用的是root用户更改为hadoop用户,也即是可以启动hive的用户 插入成功。 ......
  • 基于springboot+vue开发的教师工作量管理系
    教师工作量管理系springboot31摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了教师工作量管理系统的开发全过程。通过分析教师工作量管理系统管理的不足,创建了一个计算机管理教师工作量管理系统的方案。文章介绍了教师工作量......
  • springboot项目基于pom.xml中的maven实现多环境配置
    在SpringBoot项目中,我们可以通过在pom.xml中配置Maven插件,结合Spring的Profile实现多环境配置。下面是一种可能的实现方式:首先,在pom.xml中添加Maven插件,该插件可以用于编译、测试和打包项目。为了能够支持多环境配置,我们可以在profiles标签内定义不同的profile,然后在build标签内的......
  • idea系列---【上一次打开springboot项目还好好的,现在打开突然无法启动了】
    问题昨天走的时候项目还能正常启动,今天来了之后突然报下面的错误:Error:Kotlin:ModulewascompiledwithanincompatibleversionofKotlin.Thebinaryversionofitsmetadatais1.7.1,expectedversionis1.1.16.解决方案点击idea:Build>RebuildProject重新编译即可......