MQ消息队列(主要介绍RabbitMQ)

news2025/7/4 18:21:48

消息队列概念:是在消息的传输过程中保存消息的容器。

作用:异步处理、应用解耦、流量控制.....

RabbitMQ:

 

 

SpringBoot继承RabbitMQ步骤:

        1.加入依赖

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

         2.配置

spring:
  rabbitmq:
    host: 192.168.127.129
    virtual-host: /  # 指定虚拟主机
    port: 5672

        3.开启(如果不需要监听消息也就是不消费就不需要该注解开启)

@EnableRabbit

        4.创建队列、交换机、以及绑定它们之间的关系

   

@Configuration
public class MyMQConfig {


    


    /**
     * 创建队列
     * @return
     */
    @Bean
    public Queue createQueue(){
        //String name, boolean durable, boolean exclusive, boolean autoDelete, @Nullable Map<String, Object> arguments
        Queue queue = new Queue("order.queue",true,false,false);
        return queue;
    }


    /**
     * 创建交换机
     * @return
     */
    @Bean
    public Exchange createExchange(){
        //因为这个交换机需要根据路由进行发送  所以使用TopicExchange

        //String name, boolean durable, boolean autoDelete, Map<String, Object> arguments
        TopicExchange topicExchange = new TopicExchange("order-event-exchange",true,false);
        return  topicExchange;
    }



    /**
     * 通过路由绑定交换机和队列之间的关系
     * @return
     */
    @Bean
    public Binding createBinding(){
        //String destination, Binding.DestinationType destinationType, String exchange, String routingKey, @Nullable Map<String, Object> arguments
        Binding binding = new Binding("order.queue",
                Binding.DestinationType.QUEUE,
                "order-event-exchange",
                "order.route",
                null
        );
        return binding;
    }

}

        4.发送消息

    @Autowired
    RabbitTemplate rabbitTemplate;

    @ResponseBody
    @GetMapping("/sendmq")
    public String sendmq(){
        OrderEntity orderEntity = new OrderEntity();
        orderEntity.setOrderSn(UUID.randomUUID().toString());
        //发送消息  String exchange, String routingKey, Object message, MessagePostProcessor messagePostProcessor, @Nullable CorrelationData correlationData
        rabbitTemplate.convertAndSend("order-event-exchange","order.route",orderEntity);
        return "ok";
    }

        5.消费消息(监听消息)

@Component
@RabbitListener(queues = "create.queue")
public class OrderCloseListener {

   
    @RabbitHandler
    public void orderClose(OrderEntity orderEntity, Message message, Channel channel) throws IOException {
        System.out.println("消费消息");

    }
}

问题1:以上消息发送和消费中,如果传输的数据是java对象,默认使用的jdk序列化机制,我们经常需要使用json传递就需要修改传输格式json

修改方法如下:

@Configuration
public class RabbitConfig {

    //发送消息为对象的时候  使用json的格式
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }

}

问题2:在消息的发送和消费还有消息储存过程中,我们需要保证消息的可靠性,避免消息的丢失保证业务数据的正确

        1.消息储存:使用持久化

        1.消息发送:开启消息投靠确认机制

spring:
  rabbitmq:
    host: 192.168.127.129
    virtual-host: /  # 指定虚拟主机
    port: 5672
#    publisher-confirms: true
    publisher-confirm-type: simple # 开启生产者消息确认模式
    publisher-returns: true
@Configuration
public class RabbitConfig {

    @Autowired
    RabbitTemplate rabbitTemplate;



    /**
     * 定制rabbitTemplate
     * 消息发送确认
     */
    @PostConstruct //表示RabbitConfig对象创建之后执行该方法
    public void initRabbitTemplate(){
        //消息成功发送到服务器之后的成功回调
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             *
             * @param correlationData  消息的唯一id
             * @param b  消息是否成功
             * @param s  消息失败的原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean b, String s) {
                System.out.println("confirm===correlationData:"+ correlationData+ "ack:"+ b);
            }
        });


        //消息发送到队列queue失败执行的回调
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            /**
             *
             * @param message  消息的内容
             * @param i    回复的状态码
             * @param s     回复的文本内容
             * @param s1    那个交换机
             * @param s2    那个路由key
             *
             *              最常见的就是路由key不对
             */
            @Override
            public void returnedMessage(Message message, int i, String s, String s1, String s2) {
                System.out.println("fail====>message:"+ message+"状态码:"+i + "错误提示:"+ s+ "交换机:"+s1 + "路由:"+ s2);
            }
        });
    }
}

异常操作之后可以达到消息发送端确认机制

        3.消息消费端的确认机制

spring:
  rabbitmq:
    host: 192.168.127.129
    virtual-host: /  # 指定虚拟主机
    port: 5672
#    publisher-confirms: true
    publisher-confirm-type: simple # 开启生产者消息确认模式
    publisher-returns: true
    template:
      mandatory: true
    listener:
      simple:
        acknowledge-mode: manual # 开启消费者 手动签收消息功能
@Service
@RabbitListener(queues = "create.queue")
public class OrderCloseListener {

    @RabbitHandler
    public void orderClose(OrderEntity orderEntity, Message message, Channel channel) throws IOException {
        System.out.println("消费消息。。。.");
        try{
            //业务逻辑
            //手动确认消息消费成功,消息不在写人队列
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        }catch (Exception e){
            //消息消费失败(业务失败),将消息在次写到队列避免消息丢失
            channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);
        }


    }
}

通过以上消息的发送和消费端都确认之后我们消息一定的是可靠的。

案例:

        在实际的开发中我们经常会有取消订单的功能,就可以使用消息队列延迟消费消息,具体实现通过个死信队列,把消息先放到死信队列,当消息到期之后转到到期队列,监听到期队列然后达到订单取消功能

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

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

相关文章

汽配企业MES管理系统如何追溯产品质量问题

随着汽车行业的快速发展&#xff0c;汽配行业也面临着越来越严格的质量要求。为了满足客户需求并提高产品质量&#xff0c;汽配企业需要实现生产过程的可追溯性。MES管理系统解决方案作为生产过程的核心管理系统&#xff0c;可以通过记录生产数据和流程&#xff0c;实现产品质量…

寡肽-54/Oligopeptide-54, CG-Nokkin---------一种新型的促进头发生长的多肽

功效与应用----寡肽-54 1. 头发色素沉积和逆转头发变白过程 2. 刺激头发生长 1. Hair pigment deposition and reversal of hair whitening process 2. Stimulate hair growth 作用机理----寡肽-54 寡肽-54&#xff0c;oligopeptide-54&#xff08;CG nokkin&#xff09;增…

基于量子粒子群算法(QPSO)优化LSTM的风电、负荷等时间序列预测算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【C++杂货铺】探索string的底层实现

文章目录 一、成员变量二、成员函数2.1 默认构造函数2.2 拷贝构造函数2.3 operator2.4 c_str()2.5 size()2.6 operator[ ]2.7 iterator2.8 reserve2.9 resize2.10 push_back2.11 append2.12 operator2.13 insert2.14 erase2.15 find2.16 substr2.17 operator<<2.18 opera…

【数据结构】 LinkedList的模拟实现与使用

文章目录 &#x1f340;什么是LinkedList&#x1f334;LinkedList的模拟实现&#x1f6a9;创建双链表&#x1f6a9;头插法&#x1f6a9;尾插法&#x1f6a9;任意位置插入&#x1f6a9;查找关键字&#x1f6a9;链表长度&#x1f6a9;打印链表&#x1f6a9;删除第一次出现关键字为…

【技术】安防视频监控平台EasyNVR平台启用国标级联的操作步骤

安防视频监控汇聚EasyNVR视频集中存储平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。 为提高用户体验&#xff0c;让用户更加便捷…

【Midjourney电商与平面设计实战】创作效率提升300%

不得不说&#xff0c;最近智能AI的话题火爆圈内外啦。这不&#xff0c;战火已经从IT行业燃烧到设计行业里了。 刚研究完ChatGPT&#xff0c;现在又出来一个AI作图Midjourney。 其视觉效果令不少网友感叹&#xff1a;“AI已经不逊于人类画师了!” 现如今&#xff0c;在AIGC 热…

CSS实现一个交互感不错的卡片列表

0、需求分析 横向滚动鼠标悬停时突出显示 默认堆叠展示鼠标悬停时&#xff0c;完整展示当前块适当旋出效果 移动端样式优化、磁吸效果美化滚动条 1、涉及的主要知识块 flex 布局css 简单变换过渡 transform、transition 渐变色函数 linear-gradient… 伪类、伪元素 滚动条、…

突破欧美技术垄断,国产磁悬浮人工心脏再闯关

“现在身体状态还不错&#xff0c;一些不太剧烈的运动也可以参加。”一年前&#xff0c;湖北武汉市东西湖区的李女士突发暴发性心肌炎&#xff0c;出现心力衰竭。植入国产全磁悬浮人工心脏治疗后&#xff0c;现在李女士能正常生活。 心力衰竭是全球医学的重大挑战。据统计&…

猫云域名防红系统源码

大致功能&#xff1a;支持会员充值功能&#xff0c;对接的易支付&#xff0c;本站可以自行搭建。支持添加广告信息&#xff0c;例如进入网站前&#xff0c;先跳转个广告支持设置访问流量限制等支持设置伪域名&#xff0c;长短后缀支持屏蔽ip支持添加多个入口与落地域名支持对接…

信息安全史:半个世纪以来飞跃发展的信息安全

从20世纪60年代开始信息技术稳步上升&#xff0c;信息安全现已成为一个重要的现代问题。在过去的十年中&#xff0c;美国的雅虎、微软和Equifax等大公司都曾遭到黑客攻击。尽管近年来网络安全得到极大提高&#xff0c;但2017年的WannaCry勒索蠕虫攻击证明&#xff0c;不仅仅是信…

多个微信号怎么定时发圈?

多个微信号怎么定时发圈&#xff1f;https://mp.weixin.qq.com/s?__bizMzg2Nzg4NjEzNg&mid2247487136&idx2&sn036e1d5f9d3790b12a103a90de474957&chksmceb5fbf7f9c272e1f8e9acf644ad3d4d97fb8fdce77ec5e2a2976527d4d180ad1c277b4336c8&token495803628&…

OpenGL —— 2.5、绘制第一个三角形(附源码,glfw+glad)(更新:纹理贴图)

源码效果 C++源码 纹理图片 需下载stb_image.h这个解码图片的库,该库只有一个头文件。 具体代码: vertexShader.glsl #version 330 corelayout(location = 0) in vec3 aPos; layout(location = 1) in vec3 aColor; layout(location = 2) in vec2 aUV;out vec4 outColor; ou…

红黑的插入

定义 红黑树是一种二叉搜索树 每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black 通过对任何一条从根到叶子的路径上各个结点着色方式的限制。 红黑树确保没有一条路径会比其他路径长出俩倍&#xff0c;因而是接近平衡的。 红黑树是如何保证该核心属性的呢…

DBeaver 无法执行多行查询,报错[1064]42000

简单的两行查询&#xff0c;有分号&#xff0c;查询报错&#xff0c;无语法问题&#xff1a; 编辑连接属性&#xff1a;允许多行查询

爱校对发布全新PDF校对工具,为用户带来更为便捷的校正体验

随着数字化文档使用的普及&#xff0c;PDF格式已经成为最为广泛使用的文件格式之一。为满足广大用户对于高效、准确PDF文档校对的需求&#xff0c;爱校对团队经过深入研发&#xff0c;正式推出全新的PDF校对工具&#xff01; 这一全新工具针对PDF文件格式进行了深度优化&#…

如何在Moonriver网络上向社区代表委托投票权利

我们之前介绍了「社区代表」这一概念&#xff0c;想必大家对社区代表在治理中扮演的角色和地位有了一定的了解。 本文将介绍如何将您的投票权利委托给社区代表。请注意&#xff0c;在委托Token给社区代表这一过程中&#xff0c;并非将您的Token转移给任何人&#xff0c;而且此…

关于农林气象站的基本介绍

农林气象站可以观测各种气象参数&#xff0c;并将观测到的参数上传至农业平台&#xff0c;通过平台向人们提供数据&#xff0c;保障农作物的健康成长。 面对人口增长比例减缓、老龄化逐渐严重的现象&#xff0c;粮食生产成为人们关注的问题&#xff0c;在这种背景下&#xff0…

dll修复工具下载,msvcr120.dll丢失怎样修复

在计算机编程中&#xff0c;msvcr120.dll是一个非常重要的动态链接库文件&#xff0c;它包含了Microsoft Visual C 2010 Redistributable Package所需的运行时库。当这个文件丢失或损坏时&#xff0c;可能会导致程序无法正常运行&#xff0c;甚至出现错误提示。因此&#xff0c…

玩机搞机---安卓机型mtk和高通芯片查看分区 导出分区 备份分区的一些工具分析

前面分享过几期mtk和高通芯片机型对于备份系统 备份分区的一些博文。很多友友比较感兴趣&#xff0c;尤其是有些专门从事小众机型定制修改系统的朋友和其他从事安卓芯片类机型的玩家。因为其有些安卓设备各种途径无法获取到出厂系统。那么从当前机型备份系统和分区是有一定必要…