RabbitMQ反序列化失败:Failed to convert message

本文讲述了在使用RabbitMQ时,遇到的失败转换消息内容的异常,原因在于反序列化`FileSearchDTO`时出错。提供了两种解决方案:共享对象和使用JSON序列化/反序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🎈 1 参考文档

RabbitMQ消费消息坑:failed to convert serialized Message content | jiuchengi-cnblogs


🔍2 问题描述

org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Failed to convert message
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:156) ~[spring-rabbit-2.4.5.jar:2.4.5]
	...
Caused by: org.springframework.amqp.support.converter.MessageConversionException: failed to convert serialized Message content
	at org.springframework.amqp.support.converter.SimpleMessageConverter.fromMessage(SimpleMessageConverter.java:117) ~[spring-amqp-2.4.5.jar:2.4.5]
	at 
    ...
Caused by: java.lang.IllegalStateException: Could not deserialize object type
	at org.springframework.amqp.utils.SerializationUtils.deserialize(SerializationUtils.java:97) ~[spring-amqp-2.4.5.jar:2.4.5]
	at org.springframework.amqp.support.converter.SimpleMessageConverter.fromMessage(SimpleMessageConverter.java:113) ~[spring-amqp-2.4.5.jar:2.4.5]
	... 16 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.cauli.file.model.dto.file.FileSearchDTO
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_221]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_221]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) ~[na:1.8.0_221]
	...

💡3 原因分析

这个异常信息表明在处理消息时出现了问题,具体地说,它是由于消息内容的反序列化失败引起的。以下为关键信息:

org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Failed to convert message
    
Caused by: org.springframework.amqp.support.converter.MessageConversionException: failed to convert serialized Message content
    
Caused by: java.lang.IllegalStateException: Could not deserialize object type
    
Caused by: java.lang.ClassNotFoundException: com.cauli.file.model.dto.file.FileSearchDTO

根据异常信息的内容,问题似乎是由于反序列化消息内容时找不到类 com.cauli.file.model.dto.file.FileSearchDTO 导致的。

我目前生产者和消费者都有一个FileSearchDTO对象,内容是一模一样的包括序列化,可就是消费者接收时报序列化错误。


🚀4 解决方案

4.1 共同使用一个对象

把这个对象放到公共模块,然后生产者和消费者服务引入这个公共模块,生产者和消费者发送和消费时共用一个对象。这样完全保证了两个项目中JavaBean是一致的,所以能解决反序列失败的问题。

缺点:局限性太小,这种模式生产者和消费者只能在同一个微服务下才能使用

4.2 消息JSON序列化

4.2.1 生产者发送消息JSON序列化

生产者添加配置:

/**
 * RabbitMQ配置
 *
 * @author Tang
 * @version 1.0
 * @date 2022/05/02 23:23:27
 */
@Configuration
public class RabbitMQConfig implements InitializingBean {

    /**
     * 自动注入RabbitTemplate模板
     */
    @Resource
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送消息JSON序列化
     */
    @Override
    public void afterPropertiesSet() {
        //使用JSON序列化
        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
    }
}

4.2.2 消费者接收消息JSON反序列化

消费者添加配置:

/**
 * RabbitMQ配置
 *
 * @author Tang
 * @version 1.0
 * @date 2022/05/02 23:23:27
 */
@Configuration
public class RabbitMQConfig {

    @Bean
    public MessageConverter jsonMessageConverter(ObjectMapper objectMapper) {
        return new Jackson2JsonMessageConverter(objectMapper);
    }
}
在Ubuntu中使用VSCode配置OpenCV并编写孔明棋的步骤大致如下: 1. 安装OpenCV:首先需要在Ubuntu系统中安装OpenCV库。可以通过以下命令在终端中安装OpenCV: ``` sudo apt-get install libopencv-dev ``` 2. 安装VSCode和C/C++扩展:如果尚未安装VSCode,可以访问其官方网站下载并安装。安装完成后,需要安装C/C++扩展,以便在VSCode中编写和运行C/C++代码。 3. 创建项目文件夹:在合适的位置创建一个新的文件夹作为项目目录。 4. 创建C/C++源文件:在项目目录中创建孔明棋的源代码文件,例如`kongmingqi.cpp`。 5. 配置VSCode的`tasks.json`:需要配置一个编译任务来编译C++代码。右键点击项目目录中的`.vscode`文件夹(如果不存在则创建一个),选择“在终端中打开”,然后输入`code .`打开VSCode,并创建或修改`tasks.json`文件,加入如下配置: ```json { "version": "2.0.0", "tasks": [ { "label": "C++ build", "type": "shell", "command": "g++", "args": [ "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}", "-std=c++11", "-I/usr/include/opencv4" ], "group": { "kind": "build", "isDefault": true }, "presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": true, "clear": false }, "problemMatcher": [ "$gcc" ] } ] } ``` 6. 配置VSCode的`c_cpp_properties.json`:确保你的C++环境路径配置正确。这可以在VSCode的设置中通过“C/Cpp: Edit Configurations (UI)”命令来完成。 7. 编写孔明棋代码:在`kongmingqi.cpp`中编写孔明棋的逻辑代码。 8. 构建和运行:在VSCode中按下`Ctrl+Shift+B`启动构建任务,然后可以通过在终端中运行编译后的可执行文件来运行孔明棋。 请注意,孔明棋的实现细节取决于具体的游戏规则和你打算如何实现它。你需要编写相应的算法来实现棋盘的布局、棋子的移动规则以及游戏的胜负判断逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值