SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.24 SpringBoot 整合 RabbitMQ(topic 模式)

news2024/11/25 16:32:37

SpringBoot

【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】

SpringBoot 开发实用篇

文章目录

      • SpringBoot
      • SpringBoot 开发实用篇
      • 5 整合第三方技术
        • 5.24 SpringBoot 整合 RabbitMQ(topic 模式)
          • 5.24.1 整合RabbitMQ 【topic 模式】
          • 5.24.2 小结

5 整合第三方技术

5.24 SpringBoot 整合 RabbitMQ(topic 模式)

5.24.1 整合RabbitMQ 【topic 模式】

之前我们已经使用直连交换机模式【direct 】

在这里插入图片描述

完成了消息队列的使用,现在来用一下另一种模式,主题交换机

直接把直连的代码复制一份

在这里插入图片描述

等修改完成后,笔者会给出所有的代码

消息服务实现类

package com.dingjiaxiong.service.impl.rabbitmq.topic;

import com.dingjiaxiong.service.MessageService;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * ClassName: MessageServiceRabbitmqDirectImpl
 * date: 2022/10/22 21:25
 *
 * @author DingJiaxiong
 */

@Service
public class MessageServiceRabbitmqTopicImpl implements MessageService {

    @Autowired
    private AmqpTemplate amqpTemplate;

    @Override
    public void sendMessage(String id) {

        System.out.println("待发送短信的订单已纳入处理队列(rabbitmq topic),id " + id);
        amqpTemplate.convertAndSend("topicExchange","topic.order.id",id);

    }

    @Override
    public String doMessage() {
        return null;
    }
}

配置类

package com.dingjiaxiong.service.impl.rabbitmq.topic.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * ClassName: RabbitConfigtopic
 * date: 2022/10/22 21:29
 *
 * @author DingJiaxiong
 */

@Configuration
public class RabbitConfigTopic {

    //存储消息的消息队列的对象
    @Bean
    public Queue topicQueue(){

        return new Queue("topic_queue"); //是否持久化、是否连接专用、是否自动删除【后面其实有三个boolean参数,默认值是tff】
    }

    //还可以再来个队列,让它绑在同一个交换机上
    @Bean
    public Queue topicQueue2(){
        return new Queue("topic_queue2"); //是否持久化、是否连接专用、是否自动删除【后面其实有三个boolean参数,默认值是tff】
    }

    //消息队列不能直接使用,需要使用一个交换机去绑定它
    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange("topicExchange");
    }

    //做消息队列与交换机的绑定关系
    @Bean
    public Binding bindingTopic(){
        return BindingBuilder.bind(topicQueue()).to(topicExchange()).with("topic.order.id");
    }

    //做消息队列与交换机的绑定关系
    @Bean
    public Binding bindingTopic2(){
        return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("topic2");
    }


}

两个监听器,删掉2,留一个

package com.dingjiaxiong.service.impl.rabbitmq.topic.listener;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * ClassName: MessageListener
 * date: 2022/10/22 21:40
 *
 * @author DingJiaxiong
 */

@Component
public class MessageListener {

    //收一个消息
    @RabbitListener(queues = "topic_queue")
    public void receive(String id){

        System.out.println("已完成短信发送业务(rabbitmq topic 绑的1号消息队列),id:" + id);
    }

    //收一个消息
    @RabbitListener(queues = "topic_queue2")
    public void receive2(String id){

        System.out.println("已完成短信发送业务(rabbitmq topic 绑的2号消息队列),id:" + id);
    }

}

然后把direct 那套处理一下,全部加载就乱套 了

在这里插入图片描述

四个文件全部把注解去掉

直接启动服务器,开始测试

在这里插入图片描述

生产三个

在这里插入图片描述

从结果中可以看到,都是1 消费 的

看看服务器

在这里插入图片描述

初始化了两个队列

现在有匹配规则要注意

在这里插入图片描述

在配置类中可以修改成模糊匹配

在这里插入图片描述

这样还是可以匹配上【如果改成topic.*.ids 就不能和后面的匹配上了】

这个和direct 就不同了,direct必须完全匹配,topic模糊匹配的话,就有了一个分发的功能

如果两个队列都能被匹配

在这里插入图片描述

先再服务器中把已有的队列删掉

在这里插入图片描述

OK,启动服务器进行测试

在这里插入图片描述

服务跑起来后,

看看服务器

在这里插入图片描述

两个队列也生成了

生产一个消息

在这里插入图片描述

效果很明显,两个队列都消费了消息,这说明我们的消息发到了两个队列里

【效果显著,topic 比 direct 直连强大】

回顾一下

  • 定义消息队列(topic)

在这里插入图片描述

  • 绑定键匹配规则
    • * (星号): 用来表示一个单词 ,且该单词是必须出现的
    • # (井号): 用来表示任意数量

在这里插入图片描述

  • 生产与消费消息(topic)

在这里插入图片描述

  • 使用消息监听器对消息队列监听(topic)

在这里插入图片描述

5.24.2 小结
  1. SpringBoot整合RabbitMQ主题交换机模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FL Studio2023水果编曲软件最新版安装教程

FL Studio中文版是知名的音乐制作软件,让你的计算机就像是全功能的录音室,软件包含13种虚拟音源,可同时录制64轨音频轨,FL Studio中文版拥有的漂亮的大混音盘,先进的创作工具,让你的音乐突破想象力的限制&a…

智能化油田建设规划

一、数字化油田-技术现状 数字化油田实现了设备的远程生产过程监控,使井场实现无人值守。所以目前的设备运行维护管理系统只能实现数据统计管理,并不能实现设备状态监控及远程维护及故障诊断。 1、数字化油田— 存在的问题 缺少设备状态在线监测系统&a…

第三章. 业务功能开发--用户登录安全退出

第三章. 业务功能开发--用户登录安全退出 1. 用户登录 需求: 用户在登录页面,输入用户名和密码,点击"登录"按钮或者回车,完成用户登录的功能.*用户名和密码不能为空*用户名或者密码错误,用户已过期,用户状态被锁定,ip受限 都不能登录成功*登录成功之后,所…

Android Jetpack之Lifecycle的使用及源码分析

Lifecycle生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您编写出更有条理且往往更精简的代码,此类代码更易于维护。 尤其是在Activity和Fragment在已经默认支持LifeCycle的情…

【第五部分 | JS WebAPI】3:DOM 节点操作

目录 | 节点操作 1-1 概述 2-1 获取父节点 3-1 获取子节点(获取所有子对象 不推荐) 3-2 获取子节点(获取所有子【元素节点】) 3-3 获取首尾子节点 4-1 获取兄弟节点 5-1 动态创建、添加节点 5-2 案例:评论区 …

性能测试_JMeter_connection timed out :connect

jmeter报错:failed:connection timed out :connect/java.net.BindException: Address already in use: connect java.net.BindException: Address already in use: connectat java.net.DualStackPlainSocketImpl.connect0(Native Method)at java.net.DualStackPlainSocketImpl…

Linux系统上安装软件

安装jdk,安装tomcat,安装Mysql 四种安装方式: 安装jdk 1.去这个网站上下载linux版本的jdk Java Archive Downloads - Java SE 8 2.在虚拟机中的服务器终端中输入ifconfig(注意不是ipconfig,而是ifconfig…

智慧机场解决方案-最新全套文件

智慧机场解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 智慧机场全套最新解决方案合集一、建设背景 中国处在机场持续大规模建设过程中,政府也有意愿建设机场作为城市名片,经济持续增长会带来机场的持续建设;我国机…

螺旋模型的优点与缺点

螺旋模型: 特点: 螺旋模型在“瀑布模型”的每一个开发阶段前引入一个非常严格的风险识别、风险分析和风险控制,它把软件项目分解成一个个小项目。每个小项目都标识一个或多个主要风险,直到所有的主要风险因素都被确定 螺旋模型强…

Copilot:AI自动写代码,人工智能究竟还能取代什么?

Copilot:AI自动写代码,人工智能究竟还能取代什么? 前言 在AI绘画掀起一阵热潮之后,AI写代码又逐渐进入了我们的视野,似乎这一步我们还没想到就迅速到来了,难道说AI在取代画家之后,还要取代程序…

引擎入门 | Unity UI简介–第1部分(7)

本期我们继续为大家进行Unity UI简介(第一部分)的后续教程 本篇内容 14.放置标题图像 15.添加开始按钮 16.定位按钮 文章末尾可免费获取教程源代码 本篇Unity UI简介(第一部分)篇幅较长,分为十篇,本篇…

sqli-labs/Less-48

欢迎界面还是以sort为注入参数 接下来进行注入类型的判断 首先输入一下内容 sortrand() 多尝试几次 发现界面会发生变化 所以这一关属于数字型注入 然后我们选择使用报错注入 尝试输入一下内容 sortupdatexml(1,if(11,concat(0x7e,database(),0x7e),1),1)-- 回显如下 呦…

网络层 408真题 大题详解

1、【2009】 第一问有两种分配可能性,要想到位 记住🚩 路由器到互联网的路由相当于默认路由0/0 即目的地址0.0.0.0 子网掩码0.0.0.0 2、【2015】 注意🚩DHCP服务器不能转发信息 要观察到本图网络拓扑是同一个网络,在同一个网络中…

Linux系统man帮助一文通-尚文网络xUP楠哥

~~全文共1453字,阅读需约5分钟。 进Q群11372462,领取专属报名福利,包含云计算学习路线图代表性实战训练大厂云计算面试题资料! Linux帮助手册的常见章节 man是Manual的缩写,用来查看系统中命令和配置的帮助信息。Linux本地系统上…

Java#21(抽象与接口)

目录 一.抽象方法和抽象类 1.抽象方法: 2.抽象类: 3.注意: 二.接口 1.接口的定义 2.注意 3.接口中成员的特点 三.接口中的方法 1.JDK7以前: 接口中只能定义抽象方法2.JDK8: 接口中可以定义有方法体的方法(默认、静态) 3.JDK9: 接口中可以定义私有方法 一.抽象方法和…

【Call for papers】DSN-2023(CCF-B/截稿日期: 2022年12月7日)

文章目录1.会议信息2.时间节点3.论文主题On behalf of the Organizing Committee, we extend you a warm welcome to the 53rd Annual IEEE/IFIP International Conference on Dependable Systems and Networks (DSN 2023), organized by the University of Coimbra, Portugal.…

[ Linux ] 如何查看Linux系统版本

文章目录查看Linux内核Kernel的场景情况查看 Linux 版本的几种方式1、通过查看 redhat-release (可查看小版本)2、使用 lsb_release 命令 (可查看小版本)3、使用 hostnamectl 命令 (只可查看大版本)4、通过…

使用NNO区域进行色偏检测

想做图像的色偏检测,网上的资料全是同一套代码,就是2013年那个计算等价圆,然后直接用D-r>9 and K>0.6) or K>1.5,判断的代码(相信大家都查到过了) 但是色偏问题并不是这样简单的判断就可以的&…

一文掌握Python虚拟环境-提升你的开发效率

在真正开始Python代码编写、编译、运行、调试和开发项目之前,必须要了解下Python的虚拟环境的配置,熟悉使用后,会大大提升后续的开发效率,减少非代码原因导致的问题。virtualenv就是Python中的Virtual Environment-虚拟环境。本文…

C#界面里Form.HelpButton 属性的使用

C#界面里Form.HelpButton 属性的使用 Form.HelpButton 属性是获取或设置一个值,该值指示是否应在窗体的标题框中显示“帮助”按钮。 在一般的开发中,很少有人使用这个属性,因为程序比较简单,只要用户一上手就可以使用了。 如果界面比较复杂,或者说功能比较多,就需要使…