当前位置:

首页 > 编程开发 > springboot rabbitmq reply消息直接回复模式怎么实现

springboot rabbitmq reply消息直接回复模式怎么实现

一、使用场景MQ的作用包括了解耦、异步等。通常生产者只负责生产消息,而不关心消息谁去获取,或者消费结果如何;消费者只负责接收指定的消息进行业务处理而不关心消息从哪里来一级回复业务处理情况。但我们项目中有特殊的业务存在,我们作为消息生产者在生产消息后需要接收消费者的响应结果(说白了就是类似同步调用请求响应的MQ使用),经过研究,MQ的Reply模式(直接回复模式)就是为此种业务模式而产生。二、Reply实战(1)依赖与YML配置依赖:我这里只列出最核心的rabbitMq所需依赖org.springframe

本文目录

    一、使用场景

    MQ的作用包括了解耦、异步等。

    通常生产者只负责生产消息,而不关心消息谁去获取,或者消费结果如何;消费者只负责接收指定的消息进行业务处理而不关心消息从哪里来一级回复业务处理情况。但我们项目中有特殊的业务存在,我们作为消息生产者在生产消息后需要接收消费者的响应结果(说白了就是类似同步调用 请求响应的MQ使用),经过研究,MQ的Reply模式(直接回复模式)就是为此种业务模式而产生。

    二、Reply实战

    (1)依赖与YML配置

    依赖:

    我这里只列出最核心的rabbitMq所需依赖

    
        org.springframework.boot
        spring-boot-starter-amqp
    

    配置:

    无其余特殊配置,因为reply就是rabbitmq的一种交互方式而已

    spring:
      rabbitmq:
        host: 10.50.40.116
        port: 5673
        username: admin
        password: admin

    (2)RabbitMq bean配置

    package com.leilei.demo;
    
    import org.springframework.amqp.core.FanoutExchange;
    import org.springframework.amqp.core.Queue;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    /**
     * @author lei
     * @create 2022-09-19 21:44
     * @desc mq配置
     **/
    @Configuration
    public class RabbitMqConfig {
        @Bean
        public Queue bizQueue() {
            return new Queue("bizQueue");
        }
        @Bean
        public Queue replyQueue() {
            return new Queue("replyQueue");
        }
        @Bean
        FanoutExchange bizExchange() {
            return new FanoutExchange("bizExchange");
        }
    }

    业务类:

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Vehicle implements Serializable {
        private Integer id;
        private String name;
    }

    (3)消息生产端

    消息生产端需要做的事情:有生产消息、接受消息消费响应

    (1)生产消息

    • 1、生产消息,看业务场景选择是否生成全局唯一自定义的消息ID

    • 2、指定消息消费后响应的队列(Reply)

        /**
         * 生产消息
         *
         * @param
         * @return void
         * @author lei
         * @date 2022-09-19 21:59:18
         */
        public void replySend() {
            MessageProperties messageProperties = new MessageProperties();
            messageProperties.setReplyTo("replyQueue");
            //todo 根据业务,做一个严谨的全局唯一ID,我这里暂时用UUID
            String correlationId = UUID.randomUUID().toString();
            // 我这里指定了唯一消息ID,看业务场景,消费者消费响应后,生产者端可根据消息ID做业务处理
            messageProperties.setCorrelationId(correlationId);
            Vehicle vehicle = new Vehicle(1, "川A0001");
            Message message = new Message(JSON.toJSONString(vehicle).getBytes(), messageProperties);
            rabbitTemplate.convertAndSend("bizExchange","",message);
            System.out.println("生产者发送消息,自定义消息ID为:" + correlationId);
        }

    (2)接受Reply响应

    消费者消费消息后会将处理结果进行发送到一个队列,我们读取这里队列就可以拿到对应消息的响应结果进行业务处理了

        /**
         * 接收消息响应
         *
         * @param message
         * @return void
         * @author lei
         * @date 2022-09-19 21:59:27
         */
        @RabbitListener(queues = "replyQueue")
        public void replyResponse(Message message) {
            String s = new String(message.getBody());
            String correlationId = message.getMessageProperties().getCorrelationId();
            System.out.println("收到客户端响应消息ID:" + correlationId);
            //todo 根据消息ID可判断这是哪一个消息的响应,我们就可做业务操作
            System.out.println("收到客户端响应消息:" + s);
        }

    (4)消息消费端

    消息消费端需要做的事有:接受消息然后进行业务处理、响应消息

    (1)方法一:sendTo注解+方法返回值

    一般来说,我们mq消费者监听方法不需要返回值,我们这里使用sendTo注解,则需要将要响应的消息定义为返回值,sendTo注解中指定要响应到哪个队列

    重点:

    • 1、sendTo注解指定要相应的队列(注意和生产端保持一致)

    • 2、方法定义的返回值内容就是要响应的消息,最终会发送到sendTo注解指定要相应的队列

    • 3、这种方法的缺点是消费端的主关性很高,因为sendTo指定的目标队列可以自己瞎写,导致生产者端无法正确收到消息响应,但我相信一般项目中也不会这么干

        /**
         * 方式1   SendTo指定响应队列
         *
         * @param message
         * @return String
         * @author lei
         * @date 2022-09-19 16:17:52
         */
        @RabbitListener(queues ="bizQueue")
        @SendTo("replyQueue")
        public String handleEmailMessage(Message message) {
            try {
                String msg=new String(message.getBody(), StandardCharsets.UTF_8);
                log.info("---consumer接收到消息----{}",msg);
                return "客户端响应消息:"+msg+"处理完成!";
            } catch (Exception e) {
                log.error("处理业务消息失败",e);
            }
            return null;
        }
    (2)方法二:读取生产端的消息使用模板发送

    与普通的消费者方法一样,只需要RabbitListener注解监听业务队列;但还需要根据消息获取出ReplyTo地址,然后自己消费者方法内部手动发送消息

    • 1、优点,更强烈的感受到消息请求 响应的交互性,流程看起来更清晰

    • 2、缺点,代码不雅

        /**
         * 方式2  message消息获取内部reply rabbitmq手动发送
         *
         * @param message
         * @return String
         * @author lei
         * @date 2022-09-19 16:17:52
         */
        @RabbitListener(queues = "bizQueue")
        public void handleEmailMessage2(Message message) {
            try {
                String msg = new String(message.getBody(), StandardCharsets.UTF_8);
                log.info("---consumer接收到消息----{}", msg);
                String replyTo = message.getMessageProperties().getReplyTo();
                System.out.println("接收到的reply:" + replyTo);
                rabbitTemplate.convertAndSend(replyTo, "客户端响应消息:" + msg + "处理完成!", x -> {
                    x.getMessageProperties().setCorrelationId(message.getMessageProperties().getCorrelationId());
                    return x;
                });
            } catch (Exception e) {
                log.error("处理业务消息失败",e);
            }
        }
    (3)方法三:方法返回值

    这种方式与1其实是一致的,但我经过测试,因为生产者消息指定了ReplyTo的地址,消费者端无需自己再次手动指定,即生产消息到哪里,是否响应以及响应消息发送到哪里全由生产端自己空,消费者只需要处理自身业务以及返回结果

       /**
         * 方式三  方法有返回值,返回要响应的数据 (reply 由生产者发送消息时指定,消费者不做任何处理)
         *
         * @param message
         * @return String
         * @author lei
         * @date 2022-09-19 23:17:47
         */
        @RabbitListener(queues ="bizQueue")
        public String handleEmailMessage3(Message message) {
            try {
                String msg=new String(message.getBody(), StandardCharsets.UTF_8);
                log.info("---consumer接收到消息----{}",msg);
                return "客户端响应消息:"+msg+"处理完成!";
            }
            catch (Exception e) {
                log.error("处理业务消息失败",e);
            }
            return null;
        }
    (4)测试

    生产消息:

    springboot rabbitmq reply消息直接回复模式怎么实现

    消费消息与响应:

    springboot rabbitmq reply消息直接回复模式怎么实现

    收到的响应:

    springboot rabbitmq reply消息直接回复模式怎么实现

    链路:

    springboot rabbitmq reply消息直接回复模式怎么实现

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    RabbitMQ Fanout Exchange 多消费者正确实现指南
    RabbitMQ Fanout Exchange 多消费者正确实现指南

    在Go中使用RabbitMQFanoutExchange时,多个消费者需同时接收消息。正确做法是声明fanout类型交换器,并为每个消费者创建独立队列并绑定到该交换器,确保交换器类型正确、队列名唯一,RabbitMQ会将消息广播至所有绑定队列,实现一对多分发。

    Centos 6.4 安装erlang&rabbitmq的方法
    Centos 6.4 安装erlang&rabbitmq的方法

    在开始搭建消息队列服务之前,得先搞定两个核心组件:Erlang 和 RabbitMQ。Erlang 是 RabbitMQ 的运行时环境,所以顺序不能乱——先装 Erlang,再装 RabbitMQ。下面把整个过程拆开来讲,每一步都配了具体的命令,照着走基本不会出错。 1. 安装 Erlang 1.1

    Symfony 将RabbitMQ消息转为数组方法
    Symfony 将RabbitMQ消息转为数组方法

    答案:将Symfony中RabbitMQ消息转为数组需根据消息体格式选择反序列化方式,常见为JSON或PHP序列化;若为JSON,使用json_decode($messageBody,true)转换并校验错误;若为PHP序列化,使用unserialize()但需注意安全风险;其他格式则用对应解析器;若消息封装在对象中,需先提取消息体。

    Python RabbitMQ教程:消息队列入门指南
    Python RabbitMQ教程:消息队列入门指南

    Python操作RabbitMQ的关键在于理解其消息队列流程和工作机制,安装pika库后即可通过简单步骤实现消息发送与接收。首先需安装pika:pipinstallpika,并确保RabbitMQ服务运行;其次,发送消息时需建立连接、打开通道、声明队列并发送消息;接着,接收消息时需监听队列、定义回调函数处理消息,并注意确认机制与连接关闭;此外,实际应用中应关注异常处理、消息持久化、多消费者支持及死信队列等特性以提升系统健壮性。掌握这些步骤和注意事项后,Python结合RabbitMQ的基础操作便能快速上手

    PHP实战:RabbitMQ消息队列详解
    PHP实战:RabbitMQ消息队列详解

    PHP结合RabbitMQ构建异步处理系统需安装RabbitMQ和AMQP扩展1,通过AMQP类连接服务器2,声明交换机和队列并绑定路由键3,使用publish方法发布消息4,利用consume消费消息并调用ack确认5,为避免消息丢失应启用持久化、发布者确认或事务机制6,可通过RabbitMQManagementPlugin、命令行工具或Prometheus+Grafana监控性能7,配置死信队列处理无法消费的消息8,保证消息顺序可通过单消费者、单一队列或分组排序等策略实现9。

    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    学习如何安装、配置、部署和使用宝塔面板中的RabbitMQ可视化工具
    学习如何安装、配置、部署和使用宝塔面板中的RabbitMQ可视化工具

    RabbitMQ是一款开源的消息代理和队列服务器,旨在通过通用协议实现不同应用之间的数据共享,实现跨平台和跨语言的通信。该系统采用Erlang语言编写,并基于AMQP协议。其最显著的特点之一是在提供高度解耦的服务之间无需确保提供方的存在。接下来介绍关于如何在宝塔面板上可视化安装、配置、部署、使用RabbitMQ。一、RabbitMQ的特点1.可靠性RabbitMQ通过诸如持久化、传输确认和发布确认等机制来确保消息的可靠性。2.灵活的路由消息在进入队列之前通过交换器进行路由,可按照特定规则进行灵活分发。3.

    PHP开发中如何使用RabbitMQ实现消息传递
    PHP开发中如何使用RabbitMQ实现消息传递

    RabbitMQ是一种消息队列软件,可用于在应用程序之间进行消息传递。在PHP开发中,使用RabbitMQ可以实现异步处理任务、实现分布式系统等。本篇文章将介绍如何在PHP开发中使用RabbitMQ实现消息传递。一、安装RabbitMQ服务RabbitMQ是开源软件,可从其官网(https://www.rabbitmq.com/download.html)下

    PHP与RabbitMQ结合实现消息队列处理和分发的方法
    PHP与RabbitMQ结合实现消息队列处理和分发的方法

    随着互联网业务的不断发展,系统间的数据交换变得越来越频繁。在传统的请求响应式架构中,数据传递的方式往往是同步的,即等待请求响应结果后才能进行下一步操作,当数据量较大或者请求响应时间较长时,这种方式往往会导致系统性能下降。此时,消息队列就成为一种比较理想的解决方案,可以实现异步、解耦、扩展性好等优点。RabbitMQ作为一款消息队列中间件,提供了丰富的API,

    比较RabbitMQ和Kafka:如何选择高效的消息中间件
    比较RabbitMQ和Kafka:如何选择高效的消息中间件

    RabbitMQ和Kafka的比较:选择高效的消息中间件简介消息中间件是一种软件,它允许应用程序通过异步消息传递进行通信。消息中间件可以用于各种目的,包括:解耦应用程序:消息中间件可以将应用程序解耦,使它们能够独立于彼此开发和部署。提高可伸缩性:消息中间件可以帮助应用程序提高可伸缩性,使它们能够处理更多的并发请求。提高可靠性:消息中间件可以帮助应用程序提高可

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。