[WARN ][2019-04-22 20:51:57]Failed to read HTTP message: org.springframework.http.converter.HttpMess

经过我多次实验,终于发现!!!
GetMapping 不支持RequestBody,要用PostMapping!!!

<think>好的,我现在需要解决用户提出的关于Spring AMQP RabbitMQ消息监听器执行失败的问题,具体错误是ListenerExecutionFailedException,提示“Execution of Rabbit message listener failed”。用户已经提供了相关的引用内容,我需要结合这些信息来找到解决方案。 首先,我应该回顾用户提供的引用内容。引用1到3都是关于消费者端的错误,可能涉及消息处理时的异常。引用4提到消息序列化的问题,特别是使用默认的SimpleMessageConverter可能无法处理自定义对象。引用5指出在保存数据到数据库时出现错误,可能涉及数据库操作的问题。 接下来,我需要分析可能的原因。根据引用4,消息的序列化和反序列化问题是一个常见原因。如果发送的消息是自定义对象,而消费者没有正确配置MessageConverter,就会导致反序列化失败,从而抛出异常。另外,引用5提到的数据库操作可能存在问题,比如SQL错误、事务问题或者数据库连接问题,导致处理消息时抛出异常,从而触发监听器失败。 然后,我应该考虑其他可能的原因。例如,消息监听器的方法参数类型是否正确,如引用2中用户尝试使用Message对象接收消息,而不是特定的类型。此外,消息队列中的消息格式可能与消费者期望的不匹配,比如发送的是JSON而消费者期望的是字符串,或者反之。还有可能是消息处理逻辑中存在未捕获的异常,比如空指针、类型转换错误等,导致监听器执行失败。 接下来,我需要整理解决方案的步骤。首先,检查消息转换器的配置,确保消费者能够正确反序列化消息。例如,配置Jackson2JsonMessageConverter来处理JSON消息。其次,验证消息处理方法参数类型是否正确,是否与发送的消息类型匹配。第三,检查消息处理逻辑中的数据库操作或其他业务逻辑是否存在错误,添加详细的日志记录来定位问题。第四,考虑添加异常处理机制,比如使用try-catch块捕获异常,并手动确认消息,避免无限重试。第五,检查RabbitMQ的配置,比如队列是否存在、权限是否正确,以及网络连接是否正常。 同时,还需要考虑消息的持久化、消费者的并发设置、死信队列的处理等高级配置,以提高系统的健壮性。例如,设置重试机制,当处理失败时进行有限次数的重试,超过次数后进入死信队列,避免消息丢失或无限循环。 最后,需要确保所有配置和代码修改后,重新测试消息的发送和接收,验证问题是否解决。如果仍然存在错误,查看详细的日志输出,进一步分析具体原因。</think>针对Spring AMQP RabbitMQ消息监听器执行失败的异常(`ListenerExecutionFailedException`),以下是分步解决方案: --- ### 一、问题定位步骤 1. **检查日志详情** 查看完整异常堆栈,确定是**消息反序列化失败**、**业务逻辑异常**,还是**数据库操作错误**。例如: ```log Caused by: org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Failed to convert message ``` 2. **验证消息格式一致性** 确认生产者发送的消息类型(如JSON字符串、Java对象)与消费者期望的类型匹配。例如: - 生产者发送自定义对象时,消费者需配置`Jackson2JsonMessageConverter`[^4]。 --- ### 二、解决方案 #### 1. 配置消息转换器(解决序列化问题) ```java @Configuration public class RabbitConfig { @Bean public MessageConverter jsonMessageConverter() { return new Jackson2JsonMessageConverter(); } @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { RabbitTemplate template = new RabbitTemplate(connectionFactory); template.setMessageConverter(jsonMessageConverter()); return template; } } ``` 在消费者端添加相同配置,确保反序列化支持自定义对象[^4]。 --- #### 2. 检查消息处理方法参数类型 - **错误示例**:消费者使用`String`接收二进制数据: ```java @RabbitListener(queues = "QUEUE") public void receiveMessage(String message) { ... } // 若消息是字节数组会报错 ``` - **修正方案**:使用`Message`对象或匹配的类型: ```java @RabbitHandler(isDefault = true) public void process(Message msg) { String body = new String(msg.getBody(), StandardCharsets.UTF_8); // 显式处理字节数据[^2] } ``` --- #### 3. 添加异常处理与手动确认 ```java @Slf4j @Component @RabbitListener(queues = "hello") public class Receiver { @RabbitHandler public void handleMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) { try { // 业务逻辑(如数据库操作) saveToDatabase(message); channel.basicAck(tag, false); // 手动确认 } catch (Exception e) { log.error("处理消息失败", e); channel.basicNack(tag, false, true); // 拒绝消息并重新入队(慎用) } } } ``` 通过手动确认消息,避免因未处理异常导致消息无限重试[^5]。 --- #### 4. 配置死信队列(防止消息循环) ```yaml spring: rabbitmq: listener: simple: default-requeue-rejected: false # 禁止自动重新入队 template: retry: enabled: true max-attempts: 3 # 最大重试次数 ``` 定义死信交换机和队列,处理多次重试失败的消息[^3]。 --- ### 三、验证与测试 1. **发送测试消息** 使用`RabbitTemplate`发送消息: ```java rabbitTemplate.convertAndSend("exchange", "routingKey", new MyObject()); ``` 2. **检查消费者日志** 确认消息被正确反序列化且业务逻辑无异常。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值