首页 > 编程语言 >Java/SpringCloud/RabbitMq/无感实现消息携带用户信息 --- 逻辑讲解、代码实现、图形展示

Java/SpringCloud/RabbitMq/无感实现消息携带用户信息 --- 逻辑讲解、代码实现、图形展示

时间:2024-08-01 20:53:59浏览次数:19  
标签:Java SpringCloud springframework 购物车 topic 消息 import message 无感

一、需求:

依据黑马商城 hmall 为例,用户下单创建订单后,交易服务 trade-service 向交换机 topic 发送消息,交换机 topic 路由到队列,购物车服务 cart-service 监听此队列,实现自动清空购物车。

改造下单功能,将基于OpenFeign的清理购物车同步调用,改为基于RabbitMQ的异步通知:

  • 定义topic类型交换机,命名为trade.topic

  • 定义消息队列,命名为cart.clear.queue

  • cart.clear.queuetrade.topic绑定,BindingKeyorder.create

  • 下单成功时不再调用清理购物车接口,而是发送一条消息到trade.topic,发送消息的RoutingKeyorder.create,消息内容是下单的具体商品、当前登录用户信息

  • 购物车服务监听cart.clear.queue队列,接收到消息后清理指定用户的购物车中的指定商品

二、思路及代码:

1. 发送消息时,使用匿名内部类实现 MessagePostProcessor 接口,将用户信息保存到消息头中。

// TODO 3.清理购物车商品

try {
    rabbitTemplate.convertAndSend("trade.topic"
            , "order.create"
            , itemIds
            , new MessagePostProcessor() {

                @Override
                public Message postProcessMessage(Message message) throws AmqpException {
                    log.info("将用户信息写入消息头:{}",UserContext.getUser());
                    message.getMessageProperties().setHeader("user-info",UserContext.getUser());
                    return message;
                }

            });
} catch (AmqpException e) {
    log.error("清理购物车失败:{}", itemIds, e);

2. 因为消息都要经过消息转换器 Jackson2JsonMessageConverter,所以在这里处理。重写 Jackson2JsonMessageConverter 中的 fromMessage 方法,将用户信息从消息头中取出,存入ThreadLocal

package com.hmall.common.config;

import cn.hutool.core.util.ObjectUtil;
import com.hmall.common.utils.CollUtils;
import com.hmall.common.utils.UserContext;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConversionException;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MqConfig {

    /**
     * 设置消息转换器
     * @return
     */
   /* @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }*/

    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter(){
            @Override
            public Object fromMessage(Message message) throws MessageConversionException {
                //判断消息不为空
                if (ObjectUtil.isNotNull(message)){
                    //从消息头中取出用户信息
                    Long userId = message.getMessageProperties().getHeader("user-info");
                    //存入线程中
                    UserContext.setUser(userId);
                }
                return super.fromMessage(message);
            }
        };
    }
}

三、附gitee仓库:

https://gitee.com/ckkk524334/hmall.git 

标签:Java,SpringCloud,springframework,购物车,topic,消息,import,message,无感
From: https://blog.csdn.net/2301_80045119/article/details/140856878

相关文章

  • Java基础知识分享(二)相关练习题
    写在前面大家前面的方法和数组学的怎么样了,快来看看这些题你能不能快速地说出答案,数组和方法在Java学习中还是非常重要的,快来检测你的薄弱点在哪,及时查漏补缺!填空题1.数组会在内存中开辟一块连续固定大小的空间,每个空间相当于之前的一个变量,称为数组的元素。数组的长度一经确定......
  • Socket网络编程:Java中的实现与应用
    Socket网络编程:Java中的实现与应用大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Socket网络编程是实现网络通信的基础,通过它可以在不同的计算机之间传输数据。Java的java.net包提供了强大的网络编程功能,支持各种网络协议。本文将深入探讨Java中Socket编......
  • Java多线程编程详解:从基础到高级
    Java多线程编程详解:从基础到高级大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java的多线程编程允许程序同时执行多个任务,提高了应用的性能和响应能力。本文将从基础到高级,全面介绍Java中的多线程编程,包括线程的创建、线程池、同步机制及并发工具的使用......
  • Java串口编程:与硬件通信的实现
    Java串口编程:与硬件通信的实现大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!串口编程在与硬件设备通信时扮演着重要角色,尤其是在工业自动化、嵌入式系统和其他硬件设备的控制中。Java虽然在串口编程上并不直接支持,但通过第三方库(如JavaSerialPortAPI......
  • Java堆栈详解:内存管理与优化
    Java堆栈详解:内存管理与优化大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java的内存管理系统由堆(Heap)和栈(Stack)两部分组成,这些部分负责管理Java程序运行时的数据。理解Java堆栈的内存管理以及如何优化这些资源对于开发高效的Java应用至关重要。本文将......
  • Calendar类在Java中的使用与技巧
    Calendar类在Java中的使用与技巧大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Calendar类是Java中处理日期和时间的重要工具。虽然Java8引入了更现代的java.time包,但Calendar类依然在许多现有项目中广泛使用。本文将介绍Calendar类的基本用法、常见技......
  • javascript学习 - 函数介绍
    函数简介编程时,可能会定义许多相同或者功能相似的代码,此时我们每需要使用一次,就需要重写编写一次。虽然利用循环结构也能够实现一些简单的重复操作,但是功能较为局限。此时,我们就需要使用到JavaScript中的函数。所谓函数,就是通过将一段可以重复调用的代码块进行封装,从而......
  • javascript学习 - 面向对象
    什么是对象之前学习的数据类型在存储一些复杂的信息时,十分不方便,而且也难以区分。为此,为了更加详细方便的描述某一个事物,因而提出面向对象的概念。那什么是对象呢?所谓对象,也是JavaScript中的一种数据类型,可以看做是一系列无序数据的集合。有了对象,就可以用来描述某一......
  • javascript学习 - 数组应用
    什么是数组之前的学习中,如果我们要存储一个值,一般都是通过变量来存储。但如果我们现在想要存储一系列的值,又该如何存储呢,你可能会说可以用多个变量来进行存储。这种方法也可以,但如果你想,一旦值过多,那岂不是就要多个变量,到时候管理就很混乱了。这时候就想,有没有一个可以存储......
  • javascript学习 - 流程控制
    一个程序中,各个代码之间的执行顺序对于程序结果是会造成影响的。就拿下面简单的例子来说,假如我们拿先使用num这个变量然后再定义和先定义变量再使用相比。先使用再定义会报错undefined,而定义再使用就没有问题。也就是说,代码的先后顺序会对我们的程序结果造成直接影响。c......