RabbitMQ学习系列(一)

一文带你彻底搞懂SpringBoot-RabbitMQ(1) 一、环境搭建 采用maven多module模式,共计创建三个子module common:通用实体信息 rabbitmq-publisher:消息发布者,基于SpringBoot rabbitmq-subscriber:消息订阅者,基于SpringBoot 在消息发布者和订阅者两个项目中加入rabbitmq maven依赖 <dependency> <groupId>org.springframework.boot</groupId> 阅读详情

RabbitMQ背景介绍

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

RabbitMQ是一个开源的AMQP实现,服务器端是用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
作为老牌的MQ消息队列,我打算在接下来的时间学习一下它。

RabbitMQ应用场景

消息队列的应用场景RabbitMQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。(随便看一下就可以了。知道怎么回事就行啦)

RabbitMQ环境安装

因为我是在Docker里面安装的,安装方法也比较简单。可以参考我之前的文章Docker下载和部署项目

在这里插入图片描述
RabbitMQ是带有客户端的消息中间件,我们可以通过网址来访问它(服务器IP:15672,一般默认密码都是 guest/guest)

在这里插入图片描述

RabbitMQ常用使用的开发方法

环境也安装好了 ,接下来我们在项目中实际操作一下,看看怎么使用的
先提一个概念

RabbitMQ有很多概念的名词;

Message
消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。

Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序。

Exchange
交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。

Binding
绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。

Queue
消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。

Connection
网络连接,比如一个TCP连接。

Channel
信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。

Consumer
消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。

Virtual Host
虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。
Broker
表示消息队列服务器实体。

转载链接:https://www.jianshu.com/p/79ca08116d57/

由于这些内容设计的满多的内容,我打算在后续文章中分别介绍一下每一种的概念,这一次主要是介绍Exchange交换器和使用不同的Exchange交换器来做消息的接收和发送。

  1. DirectExchange

项目搭建

新建一个springboot项目,相关依赖如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>RabbitMQDemo</groupId>
    <artifactId>RabbitMQDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
</project>

在application中添加RabbitMQ的相关配置

server:
  port: 8888
  
spring:
  application:
    name: springboot-rabbitmq
  rabbitmq:
    host: /*这里替换成部署在Docker里面地址,如果部署在本地填写localhost即可*/
    port: 5672
    username: guest
    password: guest
    # 发布确认
    publisher-confirms: true
    virtual-host: /

交换器介绍

RabbitMQ常用的交换器一共有四种,基本上能满足所有的业务需求,交换机的实质其实是通过不同的队名名称进行匹配,接下来我们通过代码来介绍一个常用交换机的用法

  1. DirectExchange
    DirectExchange是RabbitMQ的默认交换机,直接使用routingKey匹配队列。通俗点描述就生产者直接把消息生产到指定到某一个队列上,消费者直接在这个队列上消费即可。
    **

新建一个队列

@Configuration
public class Rabbitonfig {

    /**
     *  配置routingKey,名字叫做hello的队列
     * @return
     */
    @Bean
    public Queue helloQueue() {
        return new Queue("hello");
    }
}

消息发送者

@Component
public class HelloSender {

//    rabbitTemplate是springboot 基于rabbitmq 实现的一些基本的队列消息发送功能。
    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void send() {
        String context = "hello " + LocalDate.now();
        System.out.println("Sender : " + context);
        this.rabbitTemplate.convertAndSend("hello", context);
    }
}

消息接收者

/**
 * rabbit监听已经配置的列
 *
 * @author koala
 * @date 2018/11/17
 */

@Component
public class HelloReceiver {


    @RabbitHandler
    @RabbitListener(queues = "hello")
    public void process(String hello) {
        System.out.println("Receiver1  : " + hello);
    }

}

接着我们编写一个controller层给外部调用


    @GetMapping("/hello")
    public void hello(){
        helloSender.send();
    }

我们通过接口 http://localhost:8888/rabbit/hello 访问之后,消息生产者就会把接收到的消息发送给“hello”这个队列,而我们的消费者的监听hello队列就能处理这个消息。如下图
在这里插入图片描述

  1. TopicExchange
    TopicExchange是按规则转发消息,是交换机中最灵活的一个。也是最常用的一个。
    TopicExchange交换机支持使用通配符*、#
    *号只能向后多匹配一层路径。#号可以向后匹配多层路径。

首先我们定义2个队列:

/**
 * @author koala
 * @date 2018/11/17
 * RabbitTopicExchangeConfig
 * topic 是RabbitMQ中最灵活的一种方式,可以根据routing_key自由的绑定不同的队列
 */

@Configuration
public class RabbitTopicExchangeConfig {
	
	// 队列的名字
    final static String core = "api.core";	
    final static String payment = "api.payment";


	// 创建2个队列 api.core 和 api.payment
    @Bean
    public Queue coreQueue(){
        return new Queue(RabbitTopicExchangeConfig.core);
    }
    @Bean
    public Queue paymentQueue(){
        return new Queue(RabbitTopicExchangeConfig.payment);
    }

	/**
	* 分别创建TopicExchange交换器
	**/
    @Bean
    public TopicExchange coreExchange() {
        return new TopicExchange("coreExchange");
    }

    @Bean
    public TopicExchange paymentExchange() {
        return new TopicExchange("paymentExchange");
    }

    /**
     * 将两个队列分别部署到两个交换机上,并且设置 routingkey
     *  * 表示一次词,
     *  # 表示零个或者多个词
     */
    @Bean
    public Binding bindingCoreExchange(Queue coreQueue, TopicExchange coreExchange) {
        return BindingBuilder.bind(coreQueue).to(coreExchange).with("api.core.*");
    }

    @Bean
    public Binding bindingPaymentExchange(Queue paymentQueue, TopicExchange paymentExchange) {
        return BindingBuilder.bind(paymentQueue).to(paymentExchange).with("api.payment.#");
    }

这样我们的TopExchange对列就编写好了,接下来 我们编写一个发送端和一个接收端

TopicExchange发送端

/**
 * 添加两个消息发送类(生产者)
 *  添加一个user()方法,发送消息至coreExchange交换机且routingKey为api.core.user
 *  添加一个userQuery()方法,发送消息至coreExchange交换机且routingKey为api.core.user.query
 *
 * @author koala
 * @date 2018/11/17
 */
@Component
public class ApiCoreSender {

    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void user(String msg){
        System.out.println("api.core.user send message: "+msg);
        rabbitTemplate.convertAndSend("coreExchange", "api.core.user", msg);
    }

    public void userQuery(String msg){
        System.out.println("api.core.user.query send message: "+msg);
        rabbitTemplate.convertAndSend("coreExchange", "api.core.user.query", msg);
    }
}

TopicExchange接收端


/**
 * 监听routingKey为api.core的队列消息
 *
 * @author koala
 * @date 2018/11/17
 */
@Component
public class ApiCoreReceive {

        @RabbitHandler
        @RabbitListener(queues = "api.core")
        public void user(String msg) {
            System.out.println("ApiCoreReceive得到消息:"+ msg);
    }
}

接着我们编写一个controller 看一下效果

/**
 * TopicExchangeController层
 *
 * @author koala
 * @date 2019/1/16
 */

@RestController
@RequestMapping("/topic")
public class RabbitTopicExchangeController {

    private HelloSender helloSender;
    private ApiCoreSender apiCoreSender;

    @Autowired
    RabbitTopicExchangeController(HelloSender helloSender,ApiCoreSender apiCoreSender){
        this.helloSender = helloSender;
        this.apiCoreSender = apiCoreSender;
    }


    /**
     * 消息生产者
     * @param user
     */
    @GetMapping("/user")
    public void sendUser(@RequestParam String user) {
        this.apiCoreSender.user(user);
    }

    @GetMapping("/userQuery")
    public void sendUserQuert(@RequestParam String param){
        this.apiCoreSender.userQuery(param);
    }

执行:
http://localhost:8888//topic/user?user=koala
http://localhost:8888//topic/userQuery?param=koala-param

输出:
在这里插入图片描述

  • 为什么userQuery方法没有接收到消息呢?

这是因为 我们的我们TopicExchange绑定的队列是一个“api.core.”,在topicExchange中, 号只能向后匹配一层路径。而我们userQuery的发送端却是2层路径
在这里插入图片描述
在这里插入图片描述
所以我们的消息实际上并没有发送成功,所以接收端自然无法收到。

智能零售柜商品检测实战:VOC/COCO/YOLO格式转换与YOLO11训练全攻略 目标检测是计算机视觉的核心任务之一,其本质是让模型在图像中定位并分类物体。在实际工程中,训练数据的组织与标签格式直接影响模型效果。VOC、COCO、YOLO是三种最主流的标注格式,分别对应不同训练框架的输入要求。理解它们的坐标体系与结构差异,是避免训练事故的关键。当检测场景聚焦于智能零售柜时,商品密集遮挡、类间相似和尺度变化等问题,对数据分布与训练策略提出了更高要求。本文基于一份包含5000张实拍图像的零售柜数据集,深入剖析三种标签格式的转换原理,并给出适配YOLO11跨平台训练脚本的完整参数调优思路。从数 阅读详情

相关推荐

ESP-01S使用micropython,利用Thonny烧写固件

在家舒服的太久了,想学习点新的东西,这次看上了ESP8266系列的联网设备,想自己做点小玩意出来耍耍,下面跟我一起来学习吧。本篇主要记录固件的烧写及测试。Thonny下载链接不算难,但是网上资源较少。也是提醒自己不要忘记这个步骤,记录一下,也分享给和我一样开始接触的小伙伴,加油加油,万事开头难。

weixin_43422072的博客 1693

RabbitMQ简介与springboot整合

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!大家看完有什么不懂的可以在下方留言讨论也可以关注。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!美团滴滴这类大厂的资料及案例[外链图片转存中…(img-zDh1tnZK-1712184541133)]

2401_84048161的博客 811

Windows环境下Elasticsearch与JDK版本兼容性实战指南

本文详细解析了Windows环境下Elasticsearch与JDK版本的兼容性问题,提供了从版本匹配检查到安装部署的完整实战指南。重点介绍了Elasticsearch 8.x需JDK 17+等关键版本对应关系,并分享多版本JDK共存方案及性能优化技巧,帮助开发者高效避坑。

weixin_29250403的博客 421

RabbitMQ—六种模型与Exchange类型

六种模型与Exchange类型 SpringBoot演示了Exchange三种类型的案例

可达鸭的博客 702

GD32H7 SPI驱动实战:手把手教你用SPI3连接外部Flash(W25Q128)并实现读写

本文详细介绍了基于GD32H7系列MCU的SPI3接口驱动W25Q128外部Flash的全流程开发指南。从硬件设计、引脚配置到SPI3外设深度配置,再到底层通信函数实现和高级功能优化,提供了完整的解决方案。特别针对高速读取、DMA传输和信号完整性等关键环节进行了优化,确保系统在-40℃~85℃范围内稳定工作。

weixin_28729205的博客 380

手把手教你用U盘给海信IP501H刷机:GK6323V100C芯片的4.4.2和9.0固件实战

本文详细介绍了海信IP501H电视盒子基于GK6323V100C芯片的刷机实战指南,涵盖Android 4.4.2强刷和Android 9.0免拆刷机两种方案。从工具准备、短接操作到ADB调试,提供全流程解析和常见问题解决方案,帮助用户安全高效地完成刷机操作。

lemon的博客 1456

RabbitMQ基础使用

OpenFeign的调用。这种调用中,调用者发起请求后需要等待服务提供者执行业务返回结果后,才能继续执行后面的业务。也就是说调用者在调用过程中处于阻塞状态,因此我们称这种调用方式为同步调用异步调用通常是基于消息通知的方式,包含三个角色:消息发送者:投递消息的人,就是原来的消息接收者:接收和处理消息的人,就是原来的消息代理:管理、暂存、转发消息,就是原来的服务提供方本文讲解RabbitMQ。

qq_65317837的博客 1137

UE5 VlcMedia 插件编译与流媒体播放实战

本文详细介绍了在虚幻引擎5中编译并集成VlcMedia插件以解决流媒体播放难题的实战指南。针对UE5不再默认支持Win32 API导致的编译错误,文章提供了核心的构建配置文件修改步骤,并指导如何启用插件、创建VLC媒体播放器,最终成功播放如.m3u8等格式的网络直播流或点播视频。

weixin_29013129的博客 339

Java_消息队列——RabbitMQ

d \注意如果是接收数据后处理数据导致了业务异常,那么SpringAMQP是不会抛异常的,这种情况一般需要程序员自己编写代码让MQ返回nack或者reject。延迟消息:发送者发送消息时指定一个时间,消费者不会立刻收到消息,而是在指定时间之后才收到消息。延迟任务:设置在一定时间之后才执行的任务。

wsxcjg的博客 3976

Lattice FPGA 开发工具Diamond使用流程总结——工具使用

本文介绍了一般的Diamond开发流程,包括工程创建、文件输入、IP使用、约束、管脚分配、和布线布局等流程

weixin_41895751的博客 2万+

Openharmony 命令行工具hdc的获取与安装

OpenHarmony实战:命令行工具hdc安装应用指南_hdc工具-优快云博客t=N7T8。

Devlin_的博客 1万+

RabbitMQ学习系列:一、RabbitMQ 的安装

介绍 下载 安装 Erlang 安装 RabbitMQ 安装 之前项目上使用到了ActiveMQ,所以学习了下ActiveMQ ,使用JMS结合ActiveMQ发送消息或主题,大致了解了它的使用。听说RabbitMQ 才是主流,,打算学习RabbitMQ。 介绍 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Pytho...

HJWZYY 4673

34、实数域上高效负循环卷积算法解析

本文介绍了一种高效的实数域负循环卷积算法,通过引入离散傅里叶负循环变换(DFNT)避免传统方法的冗余,显著提升计算效率。文章详细分析了算法原理、误差传播机制,并推导出误差与方差界,提出无误差和基于3σ规则的参数设置方案。结合Cooley-Tukey与Gentleman-Sande FFT路径优化,实验验证了算法在不同精度和多项式长度下的性能优势与结果正确性,为密码学与信号处理等领域提供了高精度、高性能的卷积计算解决方案。

salt的博客 115

RabbitMQ系列学习笔记(一)--认识消息队列

本文主要介绍消息队列、RabbitMQ消息队列的基本概念以及安装过程,为作者在学习RabbitMQ时的笔记,特此记录,以便后续学习中能够查漏补缺。

Scr1Pt的博客 2189

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RabbitMQ学习系列(一): 介绍

https://www.cnblogs.com/zhangweizhong/p/5687457.html   1. 介绍       RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue )协议的开源实现。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面都非常的优秀。是当前最主流的消息中间件之一。       RabbitMQ...

坚定的走 274

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

rabbitmq入门_RabbitMQ学习系列(一): RabbitMQ快速入门

RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用。作为一名合格的开发者,有必要对RabbitMQ有所了解,本文是RabbitMQ快速入门文章,主要内容包括RabbitMQ是什么、RabbitMQ核心概念、常用交换器类型等。熟悉的电商场景同学应该都知道:一般商品服务和订单服务属于两个不同的微服务,在下单的过程中订单服务需要调用商品服务进行扣库存操作。按照传统的...

weixin_39627052的博客 72

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

RabbitMQ学习系列(一):RabbitMQ的了解安装和使用

(一)概述 一般认为,消息中间件属于分布式系统中一个子系统,关注于数据的发送和接收,利用高效可靠的异步消息传递机制对分布式系统中的其余各个子系统进行集成。java中常用的消息中间件有ActiveMQ、RabbitMQ、Kafka等等。 消息中间件的作用主要有系统解耦、异步调用、流量削峰等等: 系统解耦:举个例子,系统A产生了一个数据,系统B需要这个数据,所以B要调用A。但是如果同时还有系统C...

Java鱼仔的博客 1036

RabbitMQ学习系列一:windows下安装RabbitMQ服务

Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang。 第一步下载erlang:http://www.erlang.org/download.html 第二步下载rabbitmq:http://www.rabbitmq.com/download.html 注意:安装rabbitmq需要保证本机或者服务器上面的安全软件已经完成退出,否...

weixin_34336526的博客 230
上一篇: React、Vue 封装axios实践
下一篇: 各个复杂度代表的意思
Alecor
博客等级 码龄11年 25粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值