您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

RabbitMQ之springboot操作

时间:2022-09-07 12:12:54  来源:今日头条  作者:陈三岁98

环境搭建

// maven 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
//Application
spring.application.name=rabbitmq-demo
server.port= 9099

spring.rabbitmq.host=主机
spring.rabbitmq.port=5672
spring.rabbitmq.username=test-user
spring.rabbitmq.password=123
spring.rabbitmq.virtual-host=/test-v //虚拟主机

代码操作

直连工作模式

// 生产者
@RestController
public class RabbitController {
 
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @GetMapping("createMQ")
    public void createMQ(){
 
        //  队列名称 没有则创建               发送消息信息
        rabbitTemplate.convertAndSend("test-q","hello");
    }
}

//消费者
@Component  
//                         参数               队列名称   是否持久化  是否自动删除
@RabbitListener(queuesToDeclare = @Queue(value = "test-q",durable = "true",autoDelete = "true"))
//             此处有默认值 可以只写队列名称,其它参数默认值为持久化 非独占 非自动删除
public class CustomerMQ {
 

    @RabbitHandler
    public void receive(String msg){
 
        System.out.println("msg is "+msg);
    }
}

work模型

默认轮询

该模型中消息队列只负责将消息按轮询发送至所有监听中的消费者, 与消费者的内部逻辑毫无关系

@GetMapping("workMQ")
    public void workMQ(){
 
    // 循环10
        for (int i = 0; i < 10; i++) {
 
            //  队列名称  没有则创建(随便起)           发送消息内容
            rabbitTemplate.convertAndSend("work","hello");
        }
    }

//work模型消费者监听类
@Component
public class WorkCustomer {
 
// 注意 此处 rabbitListener是作用在方法上了 这样编程更加容易
    @RabbitListener(queuesToDeclare = @Queue("work"))
    public void receive(String msg) throws InterruptedException {
 
    //此处模拟消费者1执行的慢 消费者2 执行的快 
    //很显然执行结果与消费者执行快慢没有联系 是每消费者执行5条
        Thread.sleep(2000);
        System.out.println("receive1 msg is "+msg);
    }


    @RabbitListener(queuesToDeclare = @Queue("work"))
    public void receive2(String msg){
 
        System.out.println("receive2 msg is "+msg);
    }
}

按劳分配

顾名思义,此策略下的消息队列分配消息是与 消费者的逻辑有直接联系的, 消费者需要消费完该消息并 反馈消息队列 ,消息队列才会继续发送消息至该消费者。

// 代码与上面一致 
application.properties 添加一行 限制接收消息

spring.rabbitmq.listener.simple.prefetch=1
//即可

广播模型(fanout)

该场景是经典的广播模式,消费者的消息将会发送至所有 监听中的消费者

//生产者 接口
    @GetMapping("fanoutMQ")
    public void fanoutMQ(){
 
        for (int i = 0; i < 10; i++) {
 
    // 第一个参数交换机名称 与消费者对应即可 
   //第二个参数 队列名称 此处使用临时队列 不需要值 第三参数 发送消息内容
            rabbitTemplate.convertAndSend("test-fanout","","hello");
        }
    }

//消费者类

@Component
public class FanoutCustomer {
 

    @RabbitListener(bindings = {
 
            @QueueBinding(
                    value = @Queue,// 代表使用的临时队列
                                        //   value 交换机名称 与生产者对应  type 交换机类型 fanout
                    exchange = @Exchange(value= "test-fanout",type = "fanout")
            )
    })
    public void receive(String msg) throws InterruptedException {
 
        Thread.sleep(2000);
        System.out.println("receive1 msg is "+msg);
    }


    @RabbitListener(bindings = {
 
            @QueueBinding(
                    value = @Queue,// 代表使用的临时队列
                    //   value 交换机名称 与生产者对应  type 交换机类型 fanout
                    exchange = @Exchange(value= "test-fanout",type = "fanout")
            )
    })
    public void receive2(String msg){
 
        System.out.println("receive2 msg is "+msg);
    }

}

路由模型

该模型使用固定的路由key 来选择发送消息至所有监听的消费者

// 生产者

    @GetMapping("directMQ")
    public void directMQ(){
 
        // 第一个参数交换机名称 与消费者对应即可 第二个参数 路由key 该参数决定发送至哪个消费者
         //                                     第三参数 发送消息内容
        rabbitTemplate.convertAndSend("test-direct","key1","hello");

    }

//消费者
// 说明: 此处定义四个监听消费者  一监听的key:key1 key2 key 3 二: key1 三: key2
//四 :key3 
/**
此处消费者发送是的key1 很明显消息只可能被 消费者一和消费者二接收到

*/
@Component
public class DirectCustomer {
 

    @RabbitListener(bindings = {
 
            @QueueBinding(
                    value = @Queue,// 代表使用的临时队列
                    //   value 交换机名称 与生产者对应  type 交换机类型 fanout
                    exchange = @Exchange(value= "test-direct",type = "direct") ,
                                                        // 该参数默认类型就是direct
                    key = {
 "key1","key2","key3"}
            )
    })
    public void receive(String msg) throws InterruptedException {
 
        System.out.println("receive1 msg is "+msg);
    }


    @RabbitListener(bindings = {
 
            @QueueBinding(
                    value = @Queue,// 代表使用的临时队列
                    //   value 交换机名称 与生产者对应  type 交换机类型 fanout
                    exchange = @Exchange(value= "test-direct",type = "direct") ,
                    // 该参数默认类型就是direct
                    key = {
 "key1"}
            )
    })
    public void receive2(String msg){
 
        System.out.println("receive2 msg is "+msg);
    }
    @RabbitListener(bindings = {
 
            @QueueBinding(
                    value = @Queue,// 代表使用的临时队列
                    //   value 交换机名称 与生产者对应  type 交换机类型 fanout
                    exchange = @Exchange(value= "test-direct",type = "direct") ,
                    // 该参数默认类型就是direct
                    key = {
 "key2"}                  )
    })
    public void receive3(String msg) throws InterruptedException {
 
        Thread.sleep(2000);
        System.out.println("receive1 msg is "+msg);
    }


    @RabbitListener(bindings = {
 
            @QueueBinding(
                    value = @Queue,// 代表使用的临时队列
                    //   value 交换机名称 与生产者对应  type 交换机类型 fanout
                    exchange = @Exchange(value= "test-direct",type = "direct") ,
                    // 该参数默认类型就是direct
                    key = {
 "key3"}
            )
    })
    public void receive4(String msg){
 
        System.out.println("receive2 msg is "+msg);
    }
}

topic 模型

topic模型与路由一致,就是将固定的路由key改成路由通配符,其实原理都一致,mq提供的路由通配符 * 和 #

*:匹配一个任意的单词

#: 匹配多个任意的单词

举例: 生产者发送的路由key : “test.topic”

消费者1设置的路由key :"test.* " , 消费者2设置的路由key: "test.# "

那么两个消费者都可以接收到该消息 ,但是当生产者将路由key改为 test.topic.one

这时只有消费者2可以接收到消息 因为#通配符可以接收任意多个单词

//生产者
    @GetMapping("topicMQ")
    public void topicMQ(){
 
        rabbitTemplate.convertAndSend("test-topic","key.topic","hello");
    }
    
//消费者
@Component
public class TopicCustomer {
 

    @RabbitListener(bindings = {
 
            @QueueBinding(
                    value = @Queue,// 代表使用的临时队列
                    exchange = @Exchange(value= "test-topic",type = "topic") ,
                    // 该参数默认类型就是direct
                    key = {
 "key.#","key.*"}
            )
    })
    public void receive(String msg) throws InterruptedException {
 
        System.out.println("receive msg is "+msg);
    }
    @RabbitListener(bindings = {
 
            @QueueBinding(
                    value = @Queue,// 代表使用的临时队列
                    exchange = @Exchange(value= "test-topic",type = "topic") ,
                    // 该参数默认类型就是direct
                    key = {
 "key.#"}
            )
    })
    public void receive1(String msg) throws InterruptedException {
 
        System.out.println("receive1 msg is "+msg);
    }
    @RabbitListener(bindings = {
 
            @QueueBinding(
                    value = @Queue,// 代表使用的临时队列
                    exchange = @Exchange(value= "test-topic",type = "topic") ,
                    // 该参数默认类型就是direct
                    key = {
 "key.*"}
            )
    })
    public void receive2(String msg) throws InterruptedException {
 
        System.out.println("receive2 msg is "+msg);
    }

来源:
https://blog.csdn.NET/pgcdnameming/article/detAIls/126666982



Tags:RabbitMQ   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
RabbitMQ如何实现延迟队列?
延迟队列是指当消息被发送以后,并不是立即执行,而是等待特定的时间后,消费者才会执行该消息。延迟队列的使用场景有以下几种: 未按时支付的订单,30 分钟过期之后取消订单。 给活...【详细内容】
2024-01-26  Search: RabbitMQ  点击:(46)  评论:(0)  加入收藏
RabbitMQ消息顺序性解密:保证消息的正确顺序
在分布式系统中,保证消息的正确顺序对于一些应用场景至关重要。而RabbitMQ作为一种流行的消息队列系统,本身并不提供严格的消息顺序保证。下面将探讨如何在使用RabbitMQ时实现...【详细内容】
2023-12-04  Search: RabbitMQ  点击:(126)  评论:(0)  加入收藏
RabbitMQ与消息限流策略的完美结合
在当今互联网时代,高并发访问已成为许多应用系统面临的常见挑战之一。对于需要处理大量请求的系统来说,如何保证系统的稳定性和可靠性是一个关键问题。RabbitMQ作为一种可靠的...【详细内容】
2023-11-27  Search: RabbitMQ  点击:(167)  评论:(0)  加入收藏
实时协作的秘诀:RabbitMQ与WebSockets的结合
实时协作是现代软件开发中非常重要的一个方面。为了实现实时协作,一种常见的做法是将消息队列与WebSocket技术相结合。其中,RabbitMQ是一个功能强大的消息队列系统,它能够有效...【详细内容】
2023-11-21  Search: RabbitMQ  点击:(177)  评论:(0)  加入收藏
RabbitMQ中的消息持久化策略与存储优化实践
本文将介绍RabbitMQ中的消息持久化策略,并提供一些存储优化的实践方法,帮助您确保消息的可靠性和系统的性能。在RabbitMQ消息队列中,消息的可靠性传输和持久化是非常重要的。下...【详细内容】
2023-11-15  Search: RabbitMQ  点击:(242)  评论:(0)  加入收藏
Centos7下安装部署RabbitMQ,看这篇就够了
前言RabbitMQ是一个开源的强大的企业消息系统,支持主流的操作系统,支持多种开发语言。我们项目中使用RabbitMQ作为消息队列,解耦业务,构建高可靠的消息队列系统。RabbitMQ可以...【详细内容】
2023-11-09  Search: RabbitMQ  点击:(309)  评论:(0)  加入收藏
RabbitMQ发送和接收消息的几种方式
channel.basicQos(0, 1, false):0表示对消息的大小无限制,1表示每次只允许消费一条,false表示该限制不作用于channel。同时,我们采用手工ACK的方式,因为我们配置文件配置了 spri...【详细内容】
2023-11-08  Search: RabbitMQ  点击:(263)  评论:(0)  加入收藏
RabbitMQ的四种交换机详解
交换机主要是接收消息并且转发到绑定的队列,交换机不存储消息,在启用ack模式后,交换机找不到队列会返回错误。交换机有四种类型:Direct, topic, Headers and Fanout。图片一、to...【详细内容】
2023-11-06  Search: RabbitMQ  点击:(265)  评论:(0)  加入收藏
深入浅出RabbitMQ:顺序消费、死信队列和延时队列
1. 引言在今天的文章中,我们来聊一聊 RabbitMQ,这是小 ❤ 在工作中用的最早的消息中间件,主要用于大量数据的异步消费。2. RabbitMQ2.1 核心组件RabbitMQ 是一个开源的消息中间...【详细内容】
2023-11-03  Search: RabbitMQ  点击:(178)  评论:(0)  加入收藏
在Linux系统中实现容器化的消息中间件:RabbitMQ和Kafka
消息中间件在现代分布式系统中起着至关重要的作用。它们可以在不同的应用程序之间实现可靠的异步通信,提供高吞吐量、低延迟和可扩展性。下面将介绍如何在Linux系统中使用容...【详细内容】
2023-09-08  Search: RabbitMQ  点击:(379)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(12)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(18)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(118)  评论:(0)  加入收藏
站内最新
站内热门
站内头条